Я создаю простой сервер эха, который слушает 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);
}
Вскоре у вас возникнут другие проблемы с отсутствием нуль-терминаторов при вызове printf, сбое потока или неблокирование сервера клиента <> на сервере, неспособное правильно учитывать значения, возвращаемые recv() и отправить(), другие вещи. –