2011-12-02 68 views
0

这次我编写了一个聊天服务器和客户端。这个想法是这样的。两个客户端之间的同步传输消息

服务器对readfd(FD_SET)使用select方法来查找连接的客户端上有哪些要发送的内容。如果它发现了一些东西,它会将它发送给其他客户。

以下是服务器上的选择功能和服务器的一部分code

SelectResults = select(maxDescriptor+1,&BackUpfdread,NULL,NULL,&time); 

我用select函数在客户端也让它寻求传入和outcoming消息。(这些是服务器从其他客户端发送这些,这个客户要发送)。

那么,select函数中的客户端有一个fdread和fdwrite(FD_SET)。

Here是客户端用于连接和聊天的代码的一部分。

问题是,如果我连接服务器上的两个客户端邮件传输不是并发的,这意味着客户端无法正确聊天。

最后我想在服务器中使用线程。一个等待接收和一个发送给客户的线程,但我想听到你的意见。

在此先感谢。

+0

你确实使服务器的监听和客户端套接字无阻塞? –

+0

对不起,但我不明白你的问题。 –

+0

它可能与套接字的阻塞或非阻塞状态无关(使用谷歌搜索找出它的含义),但如果我正确理解你的问题,你的服务器工作时,只有一个客户端连接,但不工作当两个客户端连接?那么这是服务器而不是客户端的问题。你可以编辑你的问题,包括小的相关服务器代码片段(比如你如何调用'select'和'accept',以及如何从客户端读取数据并向客户端发送数据)? –

回答

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 

另外不要忘记从sendrecv检查错误。尤其是recv非常重要,因为它会告诉你服务器已断开连接。

编辑:需要注意的另一个重要的事情是,插座是可写始终,因此增加一个检查,如果有什么你检查前如果套接字写来写。

相关问题