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

c 网络通信源码

c,#include,#include,#include,int main() {, int sock;, struct sockaddr_in server;, sock = socket(AF_INET, SOCK_STREAM, 0);, server.sin_family = AF_INET;, server.sin_port = htons(8080);, server.sin_addr.s_addr = inet_addr("127.0.0.1");, connect(sock, (struct sockaddr *)&server, sizeof(server));, //后续可进行数据收发等操作, return 0;,},“这段代码创建了一个TCP客户端套接字,连接到本地8080端口的服务器。实际网络通信中可根据具体需求在此基础上添加数据发送、接收等逻辑。

服务端代码

1、包含必要的头文件

#include <stdio.h>:用于标准输入输出函数,如printf

#include <stdlib.h>:提供内存分配、进程控制等函数,如mallocexit

#include <string.h>:包含字符串处理函数,如strlen

#include <sys/socket.h>:定义套接字编程相关的函数和数据结构。

#include <netinet/in.h>:定义Internet地址族相关的结构和常量。

#include <arpa/inet.h>:提供IP地址转换函数,如inet_pton

#include <unistd.h>:提供对POSIX操作系统API的访问,如close

2、创建套接字

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

这里使用socket函数创建一个流式套接字(SOCK_STREAM表示TCP协议),AF_INET表示使用IPv4地址,如果创建失败,打印错误信息并退出程序。

3、绑定套接字到端口

c 网络通信源码

 struct sockaddr_in address;
   int opt = 1;
   address.sin_family = AF_INET;
   address.sin_addr.s_addr = INADDR_ANY;
   address.sin_port = htons(8080);
   if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
       perror("setsockopt");
       exit(EXIT_FAILURE);
   }
   if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
       perror("bind failed");
       exit(EXIT_FAILURE);
   }

首先定义一个sockaddr_in结构体来存储服务器的地址信息,设置地址族为AF_INET,IP地址为任意可用地址(INADDR_ANY),端口号为8080(通过htons函数将主机字节序转换为网络字节序),然后使用setsockopt函数设置套接字选项,允许重用地址和端口,最后通过bind函数将套接字与指定的IP地址和端口绑定。

4、监听连接请求

 if (listen(server_fd, 3) < 0) {
       perror("listen");
       exit(EXIT_FAILURE);
   }

使用listen函数使套接字进入被动打开状态,开始监听来自客户端的连接请求,第二个参数指定了监听套接字的最大挂起连接数,这里设置为3。

5、接受客户端连接

 int new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
   if (new_socket < 0) {
       perror("accept");
       exit(EXIT_FAILURE);
   }

当有客户端发起连接请求时,accept函数会接受该连接,并返回一个新的套接字描述符new_socket,用于与该客户端进行通信。address结构体会被填充为客户端的地址信息。

6、读取和发送数据

 char buffer[1024] = {0};
   int valread = read(new_socket, buffer, 1024);
   printf("%s
",buffer);
   char *hello = "Hello from server";
   send(new_socket, hello, strlen(hello), 0);
   printf("Hello message sent
");

使用read函数从客户端读取数据到缓冲区buffer中,然后打印读取到的数据,接着发送一个字符串“Hello from server”给客户端,并打印发送成功的消息。

c 网络通信源码

7、关闭套接字

 close(new_socket);
   close(server_fd);

通信完成后,关闭与客户端通信的套接字new_socket以及服务器监听套接字server_fd

客户端代码

1、包含必要的头文件:与服务端相同,需要包含上述提到的头文件。

2、创建套接字:与服务端类似,使用socket函数创建一个套接字。

3、设置服务器地址

 struct sockaddr_in serv_addr;
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_port = htons(8080);
   if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
       printf("
Invalid address/ Address not supported 
");
       return -1;
   }

定义一个sockaddr_in结构体来存储服务器的地址信息,设置地址族为AF_INET,端口号为8080(通过htons函数转换),然后使用inet_pton函数将点分十进制的IP地址“127.0.0.1”转换为网络字节序的二进制形式并存储在serv_addr.sin_addr中。

4、连接到服务器

c 网络通信源码

 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
       printf("
Connection Failed 
");
       return -1;
   }

使用connect函数向服务器发起连接请求,如果连接失败,打印错误消息并返回。

5、发送和接收数据:与服务端的读写操作类似,使用send函数向服务器发送数据,使用recv函数接收服务器的响应数据。

6、关闭套接字:通信结束后,关闭套接字以释放资源。

FAQs

1、问:什么是网络通信中的错误处理?

答:在网络通信中,错误处理是非常重要的一部分,常见的错误包括连接失败、数据传输错误、套接字创建失败等,在C语言中,可以通过检查函数的返回值来判断是否发生错误,在创建套接字时,如果socket函数返回-1,则表示创建失败,可以使用perror函数打印错误信息,对于其他函数,如bindlistenacceptreadwrite等,也需要检查返回值并进行相应的错误处理,还可以设置一些信号处理函数来捕获和处理特定的信号,以提高程序的健壮性。

2、问:如何在网络通信中使用多线程提高性能?

答:在网络通信中,使用多线程可以提高程序的性能和响应能力,在一个服务器程序中,可以为每个客户端连接创建一个独立的线程来处理该连接的请求,这样可以避免一个客户端的操作阻塞其他客户端的请求,提高服务器的并发处理能力,在C语言中,可以使用pthread库来创建和管理线程,具体实现时,需要在服务器端的主线程中接受客户端的连接请求,然后为每个新连接创建一个线程,并将该连接的相关信息传递给新线程进行处理,在客户端程序中,也可以使用多线程来实现一些并发操作,如同时发送多个请求或处理多个服务器的响应等,但需要注意的是,多线程编程需要注意线程安全问题,避免出现数据竞争和死锁等情况。