我成功地将客户端连接到一个通过select函数处理I / O的服务器,然后我创建了更多带有线程的服务器。在客户端我创建了新的套接字,我成功连接到不同端口号的那些服务器并发送了第一个分别从服务器到客户端和客户端到服务器的消息。虽然这些服务器中的select可以处理新的连接,但它不能识别现有连接套接字的I / O.
客户端:
bzero(buffer,1024);
valread = read( sock , buffer, 1024);//receive first message
printf("%s\n",buffer );
while (1) {
bzero(buffer,1024);
printf("write:\n");
fgets(buffer,1024,stdin);//write something
buffer[strcspn(buffer, "\n")] = 0;
if (strcmp(buffer,"exit***")==0) {
valread = write(sock, buffer, strlen(buffer));
exit(1);
}
send(sock , buffer , strlen(buffer) , 0 );//here program stuck and waiting for select in server, but in server nothing happens
bzero(buffer,1024);
valread = read( sock , buffer, 1024);
printf("%s\n",buffer );
}
在单个服务器和许多客户端的情况下,它可以工作但是在多服务器情况下(在线程中)这样,它会卡在select函数中。是否有任何线程错误并选择?
更新
我发现错误在fgets(buffer,1024,stdin)中; 在第一次迭代中,fgets不等待用户输入内容 它传递0个字节来发送函数......服务器无法处理这个。
溶液 在我添加的代码之前((getchar())!='\ n');清除可能内部有新行并导致该行为的缓冲区