2014-12-27 2 views
2

Я создаю простой сервер эха, который слушает SOCK_STREAM и продолжает принимать бесконечные соединения. В функции int listen (int sockfd, int backlog). Я установил backlog в 1, так ли это не означает, что максимум 1 клиент может ждать в очереди?Несколько клиентов в программировании сокетов

Рассмотрите следующий случай, с которым я столкнулся.

Сервер запущен и принял соединение от клиента 1

Теперь клиент 2 пытается подключиться и подключен

Now клиента 3 попыток соединения и подключен

Теперь клиент 2 посылает «hello2» и ждет ответа

Теперь клиент 3 посылает «hello3» и ждет ответа

Теперь клиент 1 се НСР «hello1» и получает ответ «hello1» от сервера

Теперь клиент 2 получает ответ «hello2» от сервера

Затем клиент 3 получает ответ «hello3» с сервера

Как это возможно? Если клиент 2 и Клиент 3 не получают ошибку при подключении, поскольку сервер уже подключен к клиенту 1, а максимальный размер очереди равен 1?

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() и отправить(), другие вещи. –

ответ

1

если Клиент 2 и 3 Клиент не получаю сообщение об ошибке при подключении, как сервер уже подключен к клиенту 1 и размер очереди не более 1?

Нет, без ошибок.

«max QUEUE size is 1» - если accept успешно завершен, тогда очередь пуста, и другой клиент может подключиться.

+0

Да, но когда запрос от клиента 1 только что был принят, и клиент 1 еще не отправил какое-либо сообщение на сервер, в этом случае сервер занят клиентом 1. В этот момент только клиент 2 запрашивает соединение и добавляется к queue. Сразу клиент 3 также запрашивает соединение. Таким образом, в случае, если клиент 1 еще не отправил сообщение на сервер, все же соединение других клиентов будет принято. Клиент момента 1 отправляет это сообщение, сервер повторяет одно и то же сообщение, а затем тот же процесс успешно выполняется для клиента 2 и клиента 3. Как это происходит? – CyberDrone

Смежные вопросы