gpt4 book ai didi

c - 带有 pthread 的简单 Linux C/S 套接字

转载 作者:太空狗 更新时间:2023-10-29 12:20:48 26 4
gpt4 key购买 nike

所以我想在 linux 内核 2.6.x 下使用套接字将多个客户端连接到服务器。当客户端连接时,服务器将以在标准输出或其他任何方式上显示的方式向客户端发送欢迎消息。因此,当连接打开时,一个线程被分配给一个函数,该函数可以向客户端发送欢迎消息非常客户端。当我使用另一个处理器来完成这项工作时,它很好。但是,当我切换到 pthread 方式时,客户端无法从服务器获得任何东西。此时,我检查了 netstat,连接仍然on.so 我的代码出现了:

客户端.c

// to make long story short,
// i'll just omit most of declarations and stuff that is irrelavent to the problem
#define PORT 12345
#define IP_ADDR "127.0.0.1"
void *process_to_server(int socket);
int main(){
// i'll skip building socket for your convinence
process_to_server(socket_server);

}
void *process_to_server(int socket){
ssize_t size=0;
char buffer[1024];
size=read(socket,buffer,1024);
write(1,buffer,size+1);// output the welcome message to the client's standard output
}

服务器.c

#define PORT 12345
void *process_to_client(int socket);
int main(){
// same spirit as above
while(1){
int addrlen=sizeof(struct sockaddr);
socket_client = accept(socket_server,(struct sockaddr*)&client_addr,&addrlen);
if(socket_client<0) continue;

pthread_t pth;
close(socket_server);
pthread_create(&pth,NULL,(void*)&process_to_client,&socket_client);
}
}

void *process_to_client(int socket){
char buffer[1024];
sprintf(buffer,"Hello There\n");
write(socket,buffer,1024);
}

最佳答案

您正在将 &socket_client 传输到工作线程,但使用线程函数参数就好像它是 socket_client

你可以这样做:

int main() {
/*...*/
pthread_create(&pth,NULL,(void*)&process_to_client,(void*)socket_client);
/*...*/
}

void *process_to_client(void* pvsocket) {
int socket = (int) pvsocket;
/* same as before */
}

同时关闭监听套接字将使接受的连接保持打开状态。您将能够继续与连接的客户端通信,但不会接受进一步的传入连接。通信完成后,工作线程应关闭 socket_client

关于c - 带有 pthread 的简单 Linux C/S 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com