2014-12-27 69 views
2

我正在創建一個簡單的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

回答

1

是否應客戶端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