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 的通信的简单介绍。通过使用多线程编程,程序可以同时处理多个连接,提高了通信效率。
版权声明:本文标题:用C 实现多线程 Socket 的通信 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703198601h441940.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论