C Socket编程中的多个客户端

问题描述:

我正在创建一个简单的echo服务器,它监听SOCK_STREAM并继续接受无限连接。 在函数int listen(int sockfd,int backlog)中。我已将backlog设置为1,那么这是否意味着队列中最多只能有一个客户端可以等待?C Socket编程中的多个客户端

考虑下面我遇到过的情况。

服务器已启动并接受来自客户机查阅1

客户端2次的连接尝试连接并连接

现在客户机3次的连接尝试,并连接

现在客户端2发送“hello2”和答复等待

现在客户端3将“hello3”,并等待答复

现在客户端1 SE NDS“hello1”,并从服务器

得到答复“hello1”

现在客户端2会从服务器

答复“hello2”

然后客户端3得到的答复“hello3”从服务器

这怎么可能?在服务器已连接到客户端1且最大队列大小为1时,客户端2和客户端3是否应在连接时未出现错误?

Server: 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <sys/types.h> 
#include <string.h> 

#define max_request 4 
char buffer[50]; 

void clear() 
{ 
int i; 
for(i=0;i<50;i++) 
buffer[i]=NULL; 
} 

int main() 
{ 
    int status; 

    struct sockaddr_in addrport; 
    addrport.sin_family = AF_INET; 
    addrport.sin_port = htons(5100); 
    addrport.sin_addr.s_addr = htonl(INADDR_ANY); 

     int sockid = socket(PF_INET, SOCK_STREAM, 0); 

    if(bind(sockid, (struct sockaddr *) &addrport, sizeof(addrport))== -1) 
    { 
     printf("\nBinding Failed\n"); 
     return(0); 
    } 


    int listen_status=listen(sockid,1); 
    if(listen_status==-1) 
    printf("\nListening Error\n"); 
    else  
    printf("\nWaiting for connections...\n"); 


    while(1) 
    { 
     struct sockaddr_in clientaddr; 
     int addlen=sizeof(struct sockaddr_in); 

     int new_client_socket=accept(sockid,(struct sockaddr *)&clientaddr,&addlen); 

     char *client_ip; 
     client_ip=inet_ntoa(clientaddr.sin_addr); 
     printf("\n Connection from %s \n",client_ip); 


     status=recv(new_client_socket,buffer,50,0); 
     if(status!=-1) 
     status=send(new_client_socket,buffer,50,0);  
     clear(); // clears the variable buffer 

    } 



    close(sockid); 
} 

客户:

int main() 
{ 
    int s,k;char buff[50],c[50]; 

    struct sockaddr_in serverport; 

    serverport.sin_family = AF_INET; 
    serverport.sin_port = htons(5100); 
    serverport.sin_addr.s_addr = inet_addr("0.0.0.0"); 

    int sockid=socket(PF_INET,SOCK_STREAM,0); 

    int connect_status=connect(sockid,(struct sockaddr *) &serverport,sizeof(serverport)); 
    if(connect_status<0) 
    { 
     printf("\nConnection Error\n"); 
     return(1); 
    } 
    printf("\nConnected\n"); 

    gets(buff); // message to be sent to server 

    s=send(sockid,buff,50,0); 
     k=recv(sockid,c,50,0); 

    printf("\nServer : %s \n ",c); 
    close(sockid); 
} 
+0

不久,你会调用printf的时候有其他的问题,缺乏空终止的,没有线头脱落或不禁止此客户端服务器通讯科在服务器上,无法正确解释由recv的返回值()并发送(),其他的东西。 – 2014-12-27 16:42:51

是否应客户端2和客户端3,而作为连接服务器 已经连接到客户端和最大队列大小为1没有得到一个错误?

不,没有错误。

'max QUEUE size is 1' - 如果接受成功,则队列为空,另一个客户端可以连接。

+0

是的,但是当来自客户端1的请求刚被接受并且客户端1尚未向服务器发送任何消息时,在这种情况下,服务器忙于客户端1.此时,只有客户端2请求连接并被添加到队列。立即客户端3也在请求连接。所以情况是,客户端1尚未向服务器发送消息,但其他客户端的连接被接受。当客户端1发送消息时,服务器回显相同的消息,然后客户端2和客户端3的相同处理成功。这是怎么发生的? – CyberDrone 2014-12-27 17:55:26