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

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

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

c 网络核心编程

基础概念与准备工作

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

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

套接字编程步骤

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

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

c 网络核心编程

   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服务器和客户端的例子。

c 网络核心编程

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);
     }

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1522942.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希未希
上一篇 2025-01-28 01:49
下一篇 2025-01-28 01:52

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入