socket多连接的C语言通信例子
时间: 2023-08-02 22:32:48 浏览: 50
好的,以下是一个基本的多连接的 C 语言 socket 通信例子:
服务端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_CLIENTS 10
int main(int argc, char *argv[]) {
int server_socket, client_socket[MAX_CLIENTS];
struct sockaddr_in server_addr, client_addr;
char buffer[1024];
int i;
// 创建服务器 socket
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口号
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8888);
// 绑定服务器地址和端口号
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
// 开始监听
if (listen(server_socket, MAX_CLIENTS) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("等待客户端连接...\n");
// 处理客户端连接请求
while (1) {
// 接收客户端连接请求
socklen_t client_len = sizeof(client_addr);
client_socket[i] = accept(server_socket, (struct sockaddr *)&client_addr, &client_len);
if (client_socket[i] < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
printf("客户端 %s:%d 已连接!\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 接收客户端发送的消息并回复
while (1) {
// 清空缓冲区
memset(buffer, 0, sizeof(buffer));
// 接收客户端发送的消息
ssize_t n = recv(client_socket[i], buffer, sizeof(buffer), 0);
if (n < 0) {
perror("recv");
exit(EXIT_FAILURE);
} else if (n == 0) {
// 客户端已断开连接
printf("客户端 %s:%d 已断开连接!\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
close(client_socket[i]);
break;
} else {
// 打印接收到的消息
printf("接收到客户端 %s:%d 的消息:%s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer);
// 发送回复给客户端
if (send(client_socket[i], "Hello, client!", strlen("Hello, client!"), 0) < 0) {
perror("send");
exit(EXIT_FAILURE);
}
}
}
i++;
}
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
int client_socket;
struct sockaddr_in server_addr;
char buffer[1024];
// 创建客户端 socket
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口号
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(8888);
// 连接服务器
if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect");
exit(EXIT_FAILURE);
}
printf("连接服务器成功!\n");
// 发送消息给服务器
if (send(client_socket, "Hello, server!", strlen("Hello, server!"), 0) < 0) {
perror("send");
exit(EXIT_FAILURE);
}
// 接收服务器回复的消息
ssize_t n = recv(client_socket, buffer, sizeof(buffer), 0);
if (n < 0) {
perror("recv");
exit(EXIT_FAILURE);
} else if (n == 0) {
printf("服务器已断开连接!\n");
close(client_socket);
exit(EXIT_FAILURE);
} else {
printf("接收到服务器的回复:%s\n", buffer);
}
// 关闭连接
close(client_socket);
return 0;
}
```
这个例子中,服务端创建一个服务器 socket,然后绑定本地地址和端口号,开始监听客户端连接请求。当客户端连接服务器后,服务端接收客户端发送的消息并发送回复,直到客户端断开连接。同时,服务端可以处理多个客户端连接。客户端连接服务器后,发送一条消息给服务器,然后接收服务器回复的消息,最后关闭连接。