c网络编程

时间:2025-01-29 03:36:02 网络游戏

在C语言中,要实现两个客户端之间的通信,通常需要一个服务器来作为中介。服务器使用套接字(socket)来监听客户端的连接请求,并为每个连接请求创建一个新的线程来处理客户端的通信。以下是一个简化的步骤说明:

服务器端步骤

创建套接字:

使用`socket()`函数创建一个套接字。

绑定地址:

使用`bind()`函数将套接字绑定到服务器的IP地址和端口号。

监听连接:

使用`listen()`函数开始监听客户端的连接请求。

接受连接:

使用`accept()`函数接受客户端的连接请求,返回一个新的套接字用于与客户端通信。

通信:

使用`send()`和`recv()`函数与客户端进行数据发送和接收。

关闭套接字:

通信完成后,使用`close()`函数关闭套接字。

客户端步骤

创建套接字:

使用`socket()`函数创建一个套接字。

连接服务器:

使用`connect()`函数连接到服务器的IP地址和端口号。

发送和接收数据:

使用`send()`和`recv()`函数与服务器进行数据发送和接收。

关闭套接字:

通信完成后,使用`close()`函数关闭套接字。

多客户端通信

若要实现多个客户端之间的通信,服务器端需要使用多线程来处理每个客户端的连接。每个客户端连接都会创建一个新的线程,这样服务器就可以同时与多个客户端进行通信。

示例代码(服务器端)

```c

include

include

include

include

include

include

include

define PORT 5000

define BUFFER_SIZE 1024

void *handle_client(void *arg) {

int client_fd = *((int *)arg);

char readBuf[BUFFER_SIZE];

char *writeBuf = "Hello from server!";

while (1) {

int n_read = read(client_fd, readBuf, BUFFER_SIZE);

if (n_read > 0) {

writeBuf[n_read] = '\0';

printf("Received: %s\n", readBuf);

send(client_fd, writeBuf, strlen(writeBuf), 0);

}

}

close(client_fd);

return NULL;

}

int main() {

int server_fd, client_fd;

struct sockaddr_in server_addr, client_addr;

socklen_t client_addr_size;

pthread_t thread_id;

server_fd = socket(AF_INET, SOCK_STREAM, 0);

if (server_fd == -1) {

perror("socket");

exit(1);

}

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = INADDR_ANY;

server_addr.sin_port = htons(PORT);

if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {

perror("bind");

exit(1);

}

if (listen(server_fd, 5) == -1) {

perror("listen");

exit(1);

}

while (1) {

client_addr_size = sizeof(client_addr);

client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_size);

if (client_fd == -1) {

perror("accept");

continue;

}

pthread_create(&thread_id, NULL, handle_client, &client_fd);

pthread_detach(thread_id);

}

close(server_fd);

return 0;

}

```

示例代码(客户端)