Linux c socket通信 想做一个服务器做中转数据了 两个客户端进行互相通信
以下是一个简单的Linux C Socket通信的示例,包括一个服务器和两个客户端之间的互相通信。
服务器代码(server.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_BUFFER_SIZE 1024
#define SERVER_PORT 8888
int main() {
int serverSocket, clientSocket1, clientSocket2;
struct sockaddr_in serverAddr, clientAddr1, clientAddr2;
char buffer[MAX_BUFFER_SIZE];
// 创建服务器套接字
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
perror("创建套接字失败");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(SERVER_PORT);
// 绑定套接字到服务器地址
if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
perror("绑定套接字失败");
exit(EXIT_FAILURE);
}
// 监听客户端连接
if (listen(serverSocket, 2) < 0) {
perror("监听连接失败");
exit(EXIT_FAILURE);
}
printf("服务器启动,等待客户端连接...\n");
// 接受第一个客户端连接
socklen_t clientAddrSize1 = sizeof(clientAddr1);
clientSocket1 = accept(serverSocket, (struct sockaddr *)&clientAddr1, &clientAddrSize1);
if (clientSocket1 < 0) {
perror("接受第一个客户端连接失败");
exit(EXIT_FAILURE);
}
printf("客户端1连接成功\n");
// 接受第二个客户端连接
socklen_t clientAddrSize2 = sizeof(clientAddr2);
clientSocket2 = accept(serverSocket, (struct sockaddr *)&clientAddr2, &clientAddrSize2);
if (clientSocket2 < 0) {
perror("接受第二个客户端连接失败");
exit(EXIT_FAILURE);
}
printf("客户端2连接成功\n");
// 服务器开始转发数据
while (1) {
memset(buffer, 0, MAX_BUFFER_SIZE);
// 从第一个客户端接收数据
if (recv(clientSocket1, buffer, MAX_BUFFER_SIZE, 0) < 0) {
perror("接收第一个客户端数据失败");
exit(EXIT_FAILURE);
}
// 将数据发送给第二个客户端
if (send(clientSocket2, buffer, strlen(buffer), 0) < 0) {
perror("发送数据给第二个客户端失败");
exit(EXIT_FAILURE);
}
// 从第二个客户端接收数据
if (recv(clientSocket2, buffer, MAX_BUFFER_SIZE, 0) < 0) {
perror("接收第二个客户端数据失败");
exit(EXIT_FAILURE);
}
// 将数据发送给第一个客户端
if (send(clientSocket1, buffer, strlen(buffer), 0) < 0) {
perror("发送数据给第一个客户端失败");
exit(EXIT_FAILURE);
}
}
// 关闭套接字
close(clientSocket1);
close(clientSocket2);
close(serverSocket);
return 0;
}
客户端1代码(client1.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_BUFFER_SIZE 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888
int main() {
int clientSocket;
struct sockaddr_in serverAddr;
char buffer[MAX_BUFFER_SIZE];
// 创建客户端套接字
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket < 0) {
perror("创建套接字失败");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
serverAddr.sin_port = htons(SERVER_PORT);
// 连接服务器
if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
perror("连接服务器失败");
exit(EXIT_FAILURE);
}
printf("客户端1连接服务器成功\n");
// 客户端1开始发送和接收数据
while (1) {
memset(buffer, 0, MAX_BUFFER_SIZE);
// 从标准输入读取数据
printf("请输入发送给客户端2的消息:");
fgets(buffer, MAX_BUFFER_SIZE, stdin);
// 发送数据给服务器
if (send(clientSocket, buffer, strlen(buffer), 0) < 0) {
perror("发送数据给服务器失败");
exit(EXIT_FAILURE);
}
// 从服务器接收数据
if (recv(clientSocket, buffer, MAX_BUFFER_SIZE, 0) < 0) {
perror("接收数据失败");
exit(EXIT_FAILURE);
}
printf("客户端2的回复:%s\n", buffer);
}
// 关闭套接字
close(clientSocket);
return 0;
}
客户端2代码(client2.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_BUFFER_SIZE 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888
int main() {
int clientSocket;
struct sockaddr_in serverAddr;
char buffer[MAX_BUFFER_SIZE];
// 创建客户端套接字
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket < 0) {
perror("创建套接字失败");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
serverAddr.sin_port = htons(SERVER_PORT);
// 连接服务器
if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
perror("连接服务器失败");
exit(EXIT_FAILURE);
}
printf("客户端2连接服务器成功\n");
// 客户端2开始发送和接收数据
while (1) {
memset(buffer, 0, MAX_BUFFER_SIZE);
// 从标准输入读取数据
printf("请输入发送给客户端1的消息:");
fgets(buffer, MAX_BUFFER_SIZE, stdin);
// 发送数据给服务器
if (send(clientSocket, buffer, strlen(buffer), 0) < 0) {
perror("发送数据给服务器失败");
exit(EXIT_FAILURE);
}
// 从服务器接收数据
if (recv(clientSocket, buffer, MAX_BUFFER_SIZE, 0) < 0) {
perror("接收数据失败");
exit(EXIT_FAILURE);
}
printf("客户端1的回复:%s\n", buffer);
}
// 关闭套接字
close(clientSocket);
return 0;
}
编译和运行:
- 打开终端,进入代码所在的目录。
- 编译服务器代码:
gcc server.c -o server - 编译客户端1代码:
gcc client1.c -o client1 - 编译客户端2代码:
gcc client2.c -o client2 - 启动服务器:
./server - 在另外两个终端中分别启动客户端1和客户端2:
./client1和./client2 - 在客户端1的终端中输入要发送给客户端2的消息,回车发送。
- 在客户端2的终端中输入要发送给客户端1的消息,回车发送。
- 服务器会将消息转发给对应的客户端,并将客户端的回复返回给发送方。
请注意,此示例仅用于演示基本的Socket通信,没有进行错误处理和异常情况处理。在实际开发中,需要对错误进行适当处理
原文地址: https://www.cveoy.top/t/topic/ihJK 著作权归作者所有。请勿转载和采集!