admin 管理员组

文章数量: 887031


2023年12月22日发(作者:走月亮的生字)

用 C 实现多线程 Socket 的通信

Socket 是一种基于 IP 协议的网络协议,它提供网络连接和数据传输服务。在多线程编程中,可以使用 Socket 实现线程之间的通信。本文将介绍如何用 C 语言实现多线程 Socket 的通信。

首先,需要引入以下头文件:

```

#include

#include

#include

#include

#include

#include

#include

```

其中,pthread.h 提供了用于多线程编程的函数和数据类型。

下面是一个简单的 Server 实现代码:

```c

void *server_thread(void *arg) {

int server_fd, new_socket;

struct sockaddr_in address;

int opt = 1;

int addrlen = sizeof(address);

char buffer[1024] = {0};

char *message = "Hello from server";

int port = *(int*)arg;

// 创建 Socket

if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {

perror("Socket failed");

exit(EXIT_FAILURE);

}

// 设置 Socket 选项

if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR,

&opt, sizeof(opt))) {

perror("setsockopt");

exit(EXIT_FAILURE);

}

_family = AF_INET;

_addr.s_addr = INADDR_ANY;

_port = htons(port);

// 绑定 Socket 到端口号

if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))

< 0) {

perror("bind failed");

exit(EXIT_FAILURE);

}

// 监听来自客户端的连接请求

if (listen(server_fd, 3) < 0) {

perror("listen");

exit(EXIT_FAILURE);

}

// 接受客户端连接

if ((new_socket = accept(server_fd, (struct sockaddr *)&address,

(socklen_t*)&addrlen)) < 0) {

perror("accept");

exit(EXIT_FAILURE);

}

// 发送消息给客户端

send(new_socket, message, strlen(message), 0);

printf("Message sent to clientn");

// 接收来自客户端的消息

read(new_socket, buffer, 1024);

printf("Message from client: %sn", buffer);

close(new_socket);

close(server_fd);

return NULL;

}

```

上述代码中,server_thread 函数是一个 pthread_create 函数即可创建一个新的线程执行该函数:

```c

int main() {

int port = 8080;

pthread_t t_id;

if (pthread_create(&t_id, NULL, server_thread, &port) != 0) {

perror("pthread_create failed");

exit(EXIT_FAILURE);

}

// 等待子线程结束

pthread_join(t_id, NULL);

return 0;

}

```

当客户端连接到 Server 后,Server 发送一条消息给客户端,然后等待客户端发送消息过来。

下面是客户端的实现代码:

```c

void *client_thread(void *arg) {

int sock = 0;

struct sockaddr_in serv_addr;

char *hello = "Hello from client";

char buffer[1024] = {0};

int port = *(int*)arg;

// 创建 Socket

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

printf("n Socket creation error n");

return NULL;

}

serv__family = AF_INET;

serv__port = htons(port);

// 将 IPv4 地址从点分十进制转换为二进制整数表示

if(inet_pton(AF_INET, "127.0.0.1", &serv__addr)<=0)

{

printf("nInvalid address/ Address not supported n");

return NULL;

}

// 连接到 Server

if (connect(sock, (struct sockaddr *)&serv_addr,

sizeof(serv_addr)) < 0) {

printf("nConnection Failed n");

return NULL;

}

// 发送消息给 Server

send(sock, hello, strlen(hello), 0);

printf("Hello message sentn");

// 接收来自 Server 的消息

read(sock, buffer, 1024);

printf("Message from Server: %sn", buffer);

close(sock);

return NULL;

}

```

上述代码中,client_thread 函数也是一个 pthread_create 函数即可创建一个新的线程执行该函数:

```c

int main() {

int port = 8080;

pthread_t t_id;

if (pthread_create(&t_id, NULL, client_thread, &port) != 0) {

perror("pthread_create failed");

exit(EXIT_FAILURE);

}

// 等待子线程结束

pthread_join(t_id, NULL);

return 0;

}

```

当客户端连接到 Server 后,它发送一条消息给 Server,然后等待来自 Server 的回复。

以上就是用 C 实现多线程 Socket 的通信的简单介绍。通过使用多线程编程,程序可以同时处理多个连接,提高了通信效率。


本文标签: 客户端 编程 线程 连接 函数