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

如何掌握C语言网络核心编程的关键技巧?

网络核心编程涉及计算机网络通信的底层实现,包括IP地址、端口号、通信协议(如TCP/UDP)等要素,旨在实现数据在网络中的准确传输和交互。

C语言网络核心编程主要涉及套接字(Socket)编程,以下是详细介绍:

如何掌握C语言网络核心编程的关键技巧?  第1张

基础概念与准备工作

1、网络协议:网络编程基于网络协议,如TCP/IP协议族,TCP是面向连接、可靠的传输层协议,适用于文件传输、电子邮件等需要可靠传输的应用;UDP是无连接、不保证可靠性的传输层协议,具有较低的延迟和较高的传输效率,适用于视频会议、在线游戏等实时应用。

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

套接字编程步骤

1、创建套接字:使用socket()函数创建套接字,该函数返回一个套接字描述符,如果失败则返回-1。int sockfd = socket(AF_INET, SOCK_STREAM, 0);。

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

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

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

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

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

   char buff[MAX];
   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));

5、关闭套接字:当不再需要使用套接字时,应该及时关闭它,以释放资源,使用close()函数。close(connfd); close(sockfd);。

实际案例分析

1、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客户端

     #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 *hello = "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);
         // Convert IPv4 and IPv6 addresses from text to binary form
         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, hello, strlen(hello), 0);
         printf("Hello message sent
");
         int valread = read(sock, buffer, 1024);
         printf("%s
", buffer);
         close(sock);
     }
0