socket多线程通信 C语言
时间: 2024-12-26 09:22:18 浏览: 2
### C语言 Socket 多线程通信示例
#### 创建并初始化套接字
为了建立一个多线程的Socket通信程序,在C语言中首先要创建一个Socket实例。这可以通过调用`socket()`函数来完成,该函数用于创建一个新的未命名的套接字[^1]。
```c
#include <sys/socket.h>
#include <netinet/in.h>
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
}
```
#### 绑定地址到套接字
接着需要绑定本地地址给上述创建好的套接字对象。通过设置结构体`serversockaddr_in`中的成员变量,并利用`bind()`函数实现这一操作[^2]。
```c
struct sockaddr_in server_addr;
bzero((char *) &server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT_NO);
server_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
perror("ERROR on binding");
}
```
#### 启动监听模式
当成功绑定了地址之后,则可使服务器进入监听状态等待客户机发起连接请求。此时应使用`listen()`函数指定最大挂起连接数[^3]。
```c
listen(sockfd, MAX_CLIENTS);
```
#### 接受新连接与启动线程
每当有一个新的客户端尝试连接时,服务端应当接受此连接并通过`accept()`获取已连接的新描述符。随后为每一个成功的连接开启独立的工作线程去处理来自客户的交互逻辑[^4]。
```c
while(1){
int *new_sock = malloc(sizeof(int));
*new_sock = accept(sockfd, (struct sockaddr *)&client_addr,(socklen_t*)&sin_size);
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
while (1) {
recv(*new_sock,...);
send(*new_sock,...);
}
exit(0);
}
free(new_sock);
}
// 使用pthread替代fork的方式如下:
void* handle_client(void *arg) {
int client_socket = *(int*)arg;
char buffer[BUFFER_SIZE];
ssize_t bytes_received;
while ((bytes_received = read(client_socket, buffer, BUFFER_SIZE - 1)) > 0) {
buffer[bytes_received] = '\0';
write(client_socket, buffer, strlen(buffer));
memset(buffer, 0, BUFFER_SIZE);
}
close(client_socket);
pthread_exit(NULL);
}
for (;;) {
struct sockaddr_in client_address;
socklen_t address_length = sizeof(client_address);
int client_socket = accept(listen_fd, (struct sockaddr *)&client_address, &address_length);
pthread_t thread_id;
pthread_create(&thread_id, NULL, handle_client, &client_socket);
pthread_detach(thread_id);
}
```
#### 关闭套接字
最后不要忘记释放资源关闭不再使用的套接字以防止泄露。通常是在所有数据传输完毕后执行`close()`操作[^5]。
```c
close(sockfd);
```
阅读全文