C语言 实现socket服务器客户端通讯

打印 上一主题 下一主题

主题 820|帖子 820|积分 2460

在socket服务端,当吸收到来自客户端的消息后,通常的处理流程如下:
  1. 连接建立:服务端首先监听一个预设的网络地址(如IP和端口),等待客户端连接。
  2. 接受连接:当客户端发起连接请求时,服务端调用accept()方法接受连接,并创建一个新的套接字用于与客户端通信。
  3. 接收数据:服务端使用recv()或类似的函数从客户端套接字接收数据,这通常是字符串或者二进制数据。
  4. 解析消息:接收到的数据需要根据协议进行解析,比如如果消息是以某种特定格式(如JSON、XML等)编码的,需要解码后获取实际内容。
  5. 处理消息:根据接收到的客户端消息执行相应的业务逻辑,可能包括数据库操作、更新状态或其他复杂操作。
  6. 构建响应:根据处理结果,构造服务端的回复消息,可能是确认信息、错误反馈或新的数据。
  7. 发送数据:使用send()函数将响应消息发送回客户端,确保数据格式正确并设置好相应的标志(如确认或错误代码)。
  8. 关闭连接:在完成通信后,服务端可以选择关闭连接,或者在客户端断开连接后自动关闭。
复制代码
服务端实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h>
  6. #include <unistd.h>
  7. #define PORT 12345
  8. #define BUFFER_SIZE 1024
  9. int main(int argc, char *argv[]) {
  10.     int server_socket, client_socket;
  11.     struct sockaddr_in server_addr, client_addr;
  12.     socklen_t client_len = sizeof(client_addr);
  13.     char buffer[BUFFER_SIZE];
  14.     // 创建服务器套接字
  15.     if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  16.         perror("Error creating socket");
  17.         exit(1);
  18.     }
  19.     // 设置服务器地址
  20.     server_addr.sin_family = AF_INET;
  21.     server_addr.sin_addr.s_addr = INADDR_ANY; // 对应本机IP
  22.     server_addr.sin_port = htons(PORT);
  23.     // 绑定和监听
  24.     if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
  25.         perror("Error binding socket");
  26.         exit(1);
  27.     }
  28.     listen(server_socket, 1); // 等待连接
  29.     printf("Server listening on %d\n", PORT);
  30.     // 接受客户端连接
  31.     while (true) {
  32.         if ((client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len)) < 0) {
  33.             perror("Error accepting connection");
  34.             continue;
  35.         }
  36.         // 从客户端接收数据
  37.         ssize_t bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0);
  38.         if (bytes_received <= 0) {
  39.             perror("Error receiving data");
  40.             close(client_socket);
  41.             continue;
  42.         }
  43.         buffer[bytes_received] = '\0'; // 添加终止符
  44.         printf("Received from client: %s\n", buffer);
  45.         // 发送响应给客户端
  46.         send(client_socket, "Hello, client!\n", strlen("Hello, client!\n"), 0);
  47.         close(client_socket);
  48.     }
  49.     return 0;
  50. }
复制代码
客户端实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h>
  6. #include <unistd.h>
  7. #define SERVER_IP "127.0.0.1" // 服务器IP,替换为你自己的服务器IP
  8. #define PORT 12345
  9. int main(int argc, char *argv[]) {
  10.     int client_socket;
  11.     struct sockaddr_in server_addr;
  12.     char message[] = "Hello, server!";
  13.     // 创建客户端套接字
  14.     if ((client_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  15.         perror("Error creating socket");
  16.         exit(1);
  17.     }
  18.     // 设置服务器地址
  19.     server_addr.sin_family = AF_INET;
  20.     inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
  21.     server_addr.sin_port = htons(PORT);
  22.     // 连接到服务器
  23.     if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
  24.         perror("Error connecting to server");
  25.         exit(1);
  26.     }
  27.     // 向服务器发送消息
  28.     send(client_socket, message, strlen(message), 0);
  29.     printf("Sent: %s\n", message);
  30.     // 接收服务器的响应
  31.     char buffer[BUFFER_SIZE];
  32.     ssize_t bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0);
  33.     if (bytes_received <= 0) {
  34.         perror("Error receiving data");
  35.         exit(1);
  36.     }
  37.     buffer[bytes_received] = '\0';
  38.     printf("Received from server: %s\n", buffer);
  39.     close(client_socket);
  40.     return 0;
  41. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表