这次我编写聊天服务器和客户端代码。这个想法是这样的。
服务器使用select方法和readfd(FD_SET)来查找连接在其上的哪些客户端要发送的内容。如果它发现某些东西,它会发送给其他客户。
这是服务器上的select函数和服务器code的一部分。
SelectResults = select(maxDescriptor+1,&BackUpfdread,NULL,NULL,&time);
我也在客户端中使用select函数,使其寻找传入和传出消息。(服务器从其他客户端发送这些客户端以及此客户端想要发送的消息)。
嗯,select函数中的客户端有一个fdread和fdwrite(FD_SET)。
Here是客户端用于连接和聊天的代码的一部分。
问题是,如果我在服务器上连接两个客户端,则邮件传输不是并发的,这意味着客户端无法正确聊天。
最后我想在服务器中使用线程。一个用于等待接收的线程和一个用于发送给客户端的线程,但我希望听到您的意见。
答案 0 :(得分:0)
在客户端中,您不需要从0到maxDescriptor
的循环。只需检查是否设置了ConnectSocket
。像这样:
// Main loop starts here
for(; ;)
{
memset(SentBuff, 0, sizeof(SentBuff));
printf("Write: ");
gets_s(SentBuff, sizeof(SentBuff));
// Copy the fdread into BackUpfdread and fdwrite to BackUpfdwrite.
BackUpfdread = fdread;
BackUpfdwrite = fdwrite;
SelectResults = select(maxDescriptor+1,&BackUpfdread,&BackUpfdwrite,NULL,&timer);
if(SelectResults == -1)
{
perror("Client-select() error!\n");
exit(1);
}
if (FD_ISSET(ConnectSocket, &BackUpfdread))
{
RecvBytes = recv(ConnectSocket, RecvBuff, sizeof(RecvBuff), 0);
if(RecvBytes > 0)
{
printf("%s\n",RecvBuff);
// Cleaning the Receive Buffer
memset(RecvBuff,0,sizeof(RecvBuff));
}
}
if (FD_ISSET(ConnectSocket, &BackUpfdwrite))
{
SentBytes = send(ConnectSocket, SentBuff,sizeof(SentBuff),0);
// Cleaning the Sent Buffer
memset(SentBuff,0,sizeof(SentBuff));
}
} // Main loop ends here
另外,请不要忘记检查来自send
和recv
的错误。特别是recv
很重要,因为它会告诉您服务器已断开连接。
编辑:另一个需要注意的重要事项是,套接字可能始终可写,因此在检查套接字是否可写之前,请检查是否有要写的内容。