当前位置:首页 > 行业动态 > 正文

c 网络编程教程

网络编程教程主要教授如何使用编程语言进行网络通信和数据传输。

C语言网络编程是利用C语言进行网络应用程序开发的过程,它使得程序能够通过网络进行数据传输和通信,以下是关于C语言网络编程的详细教程:

1、基础概念与准备工作

网络编程基础知识:网络编程是通过网络进行数据传输的技术,最常用的协议是TCP/IP协议,TCP是面向连接的、可靠的传输协议;UDP是无连接的、不保证可靠性的传输协议。

套接字的概念:套接字(Socket)是网络编程的核心,它是操作系统提供的一种网络通信接口,通过它,程序可以在网络上发送和接收数据,套接字可以分为流套接字(用于TCP)和数据报套接字(用于UDP)。

2、套接字编程步骤

c 网络编程教程  第1张

创建套接字:在C语言中,使用socket()函数来创建套接字,该函数返回一个套接字描述符,如果失败则返回-1。

     int sockfd;
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd == -1) {
         perror("socket creation failed");
         exit(EXIT_FAILURE);
     }

绑定套接字:对于服务器端程序,需要将套接字绑定到一个特定的IP地址和端口号,使用bind()函数来实现。

     struct sockaddr_in servaddr;
     servaddr.sin_family = AF_INET;
     servaddr.sin_addr.s_addr = INADDR_ANY;
     servaddr.sin_port = htons(PORT);
     if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
         perror("socket bind failed");
         exit(EXIT_FAILURE);
     }

监听和接受连接:服务器端需要监听端口,等待客户端连接,使用listen()accept()函数来实现。

     if (listen(sockfd, 5) != 0) {
         perror("Listen failed");
         exit(EXIT_FAILURE);
     }
     int connfd;
     connfd = accept(sockfd, (struct sockaddr *)&cli, &len);
     if (connfd < 0) {
         perror("server accept failed");
         exit(EXIT_FAILURE);
     }

发送和接收数据:无论是客户端还是服务器端,都需要发送和接收数据,使用send()recv()函数来实现。

c 网络编程教程  第2张

     char buff[MAX];
     int n;
     bzero(buff, sizeof(buff));
     read(connfd, buff, sizeof(buff));
     printf("From client: %s", buff);
     bzero(buff, sizeof(buff));
     n = 0;
     while ((buff[n++] = getchar()) != 'n');
     write(connfd, buff, sizeof(buff));

3、TCP和UDP的区别与选择

TCP协议:TCP是面向连接的协议,提供可靠的、双向的字节流传输,它保证数据按顺序到达,并且没有数据丢失,适用于需要可靠传输的应用,例如文件传输、电子邮件等。

UDP协议:UDP是无连接的协议,不保证数据按顺序到达,也不保证数据不丢失,它具有较小的传输开销和较高的传输速度,适用于实时应用,例如视频会议、在线游戏等。

4、实际案例分析

c 网络编程教程  第3张

TCP服务器与客户端:下面是一个简单的TCP服务器和客户端的例子,TCP服务器:

     #include <stdio.h>
     #include <netdb.h>
     #include <netinet/in.h>
     #include <stdlib.h>
     #include <string.h>
     #include <unistd.h>
     #define MAX 80
     #define PORT 8080
     #define SA struct sockaddr
     void func(int sockfd) {
         char buff[MAX];
         int n;
         for (;;) {
             bzero(buff, MAX);
             read(sockfd, buff, sizeof(buff));
             printf("From client: %s", buff);
             bzero(buff, MAX);
             n = 0;
             while ((buff[n++] = getchar()) != 'n');
             write(sockfd, buff, sizeof(buff));
         }
     }
     int main() {
         int sockfd, connfd, len;
         struct sockaddr_in servaddr, cli;
         sockfd = socket(AF_INET, SOCK_STREAM, 0);
         if (sockfd == -1) {
             printf("socket creation failed...n");
             exit(0);
         }
         bzero(&servaddr, sizeof(servaddr));
         servaddr.sin_family = AF_INET;
         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
         servaddr.sin_port = htons(PORT);
         if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) {
             printf("socket bind failed...n");
             exit(0);
         }
         if ((listen(sockfd, 5)) != 0) {
             printf("Listen failed...n");
             exit(0);
         }
         len = sizeof(cli);
         connfd = accept(sockfd, (SA*)&cli, &len);
         if (connfd < 0) {
             perror("Accept failed");
             close(sockfd);
             exit(EXIT_FAILURE);
         }
         func(connfd);
         close(connfd);
         close(sockfd);
     }

TCP客户端:下面是一个简单的TCP客户端的例子,TCP客户端:

     #include <stdio.h>
     #include <stdlib.h>
     #include <string.h>
     #include <unistd.h>
     #include <arpa/inet.h>
     #include <sys/socket.h>
     #define PORT 8080
     int main() {
         int sock = 0;
         struct sockaddr_in serv_addr;
         char *message = "Hello from client";
         char buffer[1024] = {0};
         if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
             printf("
Socket creation error 
");
             return -1;
         }
         serv_addr.sin_family = AF_INET;
         serv_addr.sin_port = htons(PORT);
         if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
             printf("
Invalid address/ Address not supported 
");
             return -1;
         }
         if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
             printf("
Connection failed 
");
             return -1;
         }
         send(sock, message, strlen(message), 0);
         printf("Hello message sent
");
         read(sock, buffer, 1024);
         printf("%s
", buffer);
         return 0;
     }
0