在C程序中跨套接字实现多线程时遇到问题
我正在用C语言创建一个使用套接字和线程的客户机-服务器聊天程序,但在实现多线程时遇到了一个问题。我目前得到的是一个服务器,它使用到目前为止仍在工作的套接字从客户端获取连接,问题是当我尝试创建多个线程来处理发送和接收时 当客户机成功连接到服务器套接字时,在到达客户机程序的主while循环之前,在客户机中创建一个线程,用于处理接收消息“connected to server id:x” 当客户机到达服务器时,将在服务器中创建一个线程来处理数据的发送 他们似乎工作正常,但这是执行令,让我。当我将客户机连接到服务器时,我认为会发生的事情是,创建用于接收来自服务器的消息的线程将执行主while循环。但是,线程似乎正在等待主循环获取输入在C程序中跨套接字实现多线程时遇到问题,c,multithreading,sockets,pthreads,C,Multithreading,Sockets,Pthreads,我正在用C语言创建一个使用套接字和线程的客户机-服务器聊天程序,但在实现多线程时遇到了一个问题。我目前得到的是一个服务器,它使用到目前为止仍在工作的套接字从客户端获取连接,问题是当我尝试创建多个线程来处理发送和接收时 当客户机成功连接到服务器套接字时,在到达客户机程序的主while循环之前,在客户机中创建一个线程,用于处理接收消息“connected to server id:x” 当客户机到达服务器时,将在服务器中创建一个线程来处理数据的发送 他们似乎工作正常,但这是执行令,让我。当我将客户机
// CURRENT CLIENT CODE - only including threading code
void * client_receive(void * sockID) {
int network_socket = *((int *) sockID);
while(1) {
char data[1024];
recv(network_socket, data, 1024, 0);
printf("%s", data);
}
}
int main() {
pthread_t thread;
pthread_create(&thread, NULL, client_receive, (void *) &network_socket);
while(1) {
printf("type a message: ");
scanf("%s", message);
send(network_socket, message, 1024, 0);
}
}
________________________________________________________________________________
// CURRENT SERVER CODE
struct client {
int index;
int sockID;
struct sockaddr_in clientAddr;
int len;
};
void * client_interact(void * client_detail) {
struct client* client_Detail = (struct client*) client_detail;
int index = client_Detail -> index;
int clientSocket = client_Detail -> sockID;
index = index + 1;
printf("Client connected");
char message[1024] = "Welcome!";
send(clientSocket, message, 1024, 0);
while(1) {
char receive[1024];
recv(clientSocket, &receive, 1024, 0);
printf("Client: %s", receive);
}
}
struct client Client[1024];
pthread_t thread[1024];
int main() {
while(1) {
pthread_create(&thread[client_count], NULL, client_interact, (void *) &Client[client_count]);
client_count++;
}
for (int i = 0; i < client_count; i++) {
pthread_join(thread[i], NULL);
}
return 0;
}
//当前客户端代码-仅包括线程代码
void*客户端接收(void*sockID){
int-network_-socket=*((int*)sockID);
而(1){
字符数据[1024];
recv(网络插座,数据,1024,0);
printf(“%s”,数据);
}
}
int main(){
pthread\u t线程;
pthread_create(&thread,NULL,client_receive,(void*)和network_socket);
而(1){
printf(“键入消息:”);
scanf(“%s”,消息);
发送(网络_套接字,消息,1024,0);
}
}
________________________________________________________________________________
//当前服务器代码
结构客户端{
整数指数;
int-sockID;
clientAddr中的结构sockaddr_;
内伦;
};
void*客户端交互(void*客户端详细信息){
结构客户端*客户端详细信息=(结构客户端*)客户端详细信息;
int index=客户详细信息->索引;
int clientSocket=client\u Detail->sockID;
指数=指数+1;
printf(“客户连接”);
字符消息[1024]=“欢迎!”;
发送(clientSocket,message,1024,0);
而(1){
字符接收[1024];
recv(clientSocket和receive,1024,0);
printf(“客户端:%s”,接收);
}
}
结构客户端[1024];
pthread_t thread[1024];
int main(){
而(1){
pthread_create(&thread[client_count],NULL,client_interactive,(void*)和client[client_count]);
客户端计数++;
}
对于(int i=0;i
我是否误解了线程的执行?我认为“client_receive”将在主打印“键入消息”之前在创建的线程上执行当
main
中的循环时,实际上不可能判断client_receive
是否在之前执行;这由调度程序决定。但是,client\u receive
在从套接字接收到一些数据之前不会打印任何内容,因此除非您的客户端向服务器发送一些数据,client\u receive
函数将在调用recv
时阻塞
因此,虽然您的程序似乎在运行client\u receive
之前正在等待输入,但可能是client\u receive
正在阻止对recv
的调用,而您的主线程正在等待输入
如果您的客户机实际上正在发送数据,而您的服务器似乎没有响应该数据,则可能是客户机端存在某种缓冲。因此,确保flush
客户端的套接字强制将数据推送到服务器,从而调用recv
旁注:我假设您实际设置套接字连接并将句柄存储到network\u socket
中的代码没有包含在内,否则可能会出现问题 我留下了处理套接字的代码,只是为了让它更容易阅读(应该更清楚)。初始连接后似乎出现了死锁,服务器和客户端都确认连接,但在其中一个连接终止之前,服务器和客户端都不会发送或接收数据,然后另一个接收发送的任何数据在发送数据后,您是否尝试在客户端上刷新套接字?是的,也不会打印任何东西,只是等待一些我无法解决的问题。你也可以包括你的客户代码吗?这可能是因为客户端和主线程之间没有同步,所以两者都将同时执行。所以你可能会看到它们的任意顺序。哦,好吧,你会建议使用互斥锁吗?这取决于你想做什么。如果你想修复顺序,你可以使用一些锁,但是不使用线程可能更容易。不幸的是,这是这个项目的一个要求。虽然,这一点上的顺序很烦人,但它并不能解释我得到的死锁。您所展示的代码目前没有明显的死锁问题——您需要创建一个显示死锁发生方式的代码。