Приветствие !!
Я использую библиотеку unpv13e в linux, разработанную как сервер сокетов, и слушаю порт, который
примет 3 (не более) клиентов сокетов, каждый клиент будет иметь свой собственный поток ....
Хотя эти 3 клиента отправляют очень быстро, функция recv сервера сокетов
получить указанную половину строки от клиента1, половину другой от клиента2,
это странно, потому что я думаю, что эти 3 клиента сокета будут работать в другом потоке,
также другой идентификатор сокета, так что мне интересно, почему это произошло? позвольте мне объяснить в
следующие коды:
listenfd = Tcp_listen(ipaddr,portno,&addrlen);
cliaddr = Malloc(addrlen);
Signal(SIGINT, sig_int);
for ( ; ; ) {
clilen = addrlen;
connfd = Accept(listenfd, cliaddr, &clilen);
err_msg("id [%05d] conned from %s",connfd,Sock_ntop(cliaddr, clilen));
Pthread_create(&tid, NULL, &doit, (void *) connfd);
}
void * doit(void *arg)
{
void web_child(int);
Pthread_detach(pthread_self());
web_child((int) arg);
Close((int) arg);
printf("thread [%05d] dead...\n",(int) arg);
return(NULL);
}
void web_child(int sockfd)
{
int connfd;
ssize_t nread;
char line[1024];
for ( ; ; )
{
line[0]=0x00 ;
if ( (nread = Readline(sockfd, line, 1024)) == 0)
break; /* connection closed by other end */
line[nread-2]=0x00 ;
if(strncmp(line,"101",3)==0)
Do101(line) ;
if(strncmp(line,"201",3)==0)
Do201(line) ;
if(strncmp(line,"301",3)==0)
Do301(line) ;
}
}
Функция Readline в вызове библиотеки unpv13e recv и проверка по одному символу за раз
пока это не '\ n' и возврат, nread обычно 315 байтов или около того,
а у меня нету в этом сокете сервера !!
На мой взгляд, функция web_child запускается как нить, с другим socketfd,
и line это local var, так что 3 разных клиента не будут влиять друг на друга,
сокет client1 всегда отправляет строку, начинающуюся с «101», а client2 всегда отправляет «201»,
client3 отправить "301" ....
Но иногда я увижу строку в Do101 (строка), в которой ее половина равна "101",
и вторая половина этого пришла от client2, они просто влияют друг на друга ...
если эти 3 клиента отправляют очень и очень часто, это может случиться ... не очень часто,
но это просто случилось !!
Что за ошибка в коде? recv из разных сокетов в разных ветках
будут влиять друг на друга?
Любые предложения приветствуются! Спасибо !!