问候!
我使用开发为socket服务器的linux中的unpv13e库,并监听一个端口
将接受3个套接字客户端(最多),每个客户端都有自己的线程....
虽然这3个客户端发送的速度非常快,但套接字服务器的recv功能会
接收到来自客户端1的一半字符串,另一半来自客户端2,
这很奇怪,因为我认为这3个套接字客户端将运行在不同的线程中,
也有不同的套接字ID,所以我很好奇它为什么发生?让我解释一下
以下代码:
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) ;
}
}在unpv13e库中的readline函数调用recv,并且一次检查一个字符
直到它是'\ n'并返回,通常315字节左右,
我没有发送这个套接字服务器!
在我看来,web_child函数是作为线程运行的,具有不同的socketfd,
而line是局部变量,所以3个不同的客户端不会相互影响,
套接字client1将始终以“101”发送字符串开头,并且client2始终发送“201”,
client3发送“301”....
但有些搜索结果会在Do101(行)中看到一个字符串,其中一半是“101”,
而后半部分来自client2,它们只是互相影响......
如果这3个客户非常频繁地发送,可能会发生......不是很频繁,
但它刚刚发生!
代码中有什么样的错误?在不同的线程中从不同的socketid recv
会互相影响?
任何建议,欢迎!谢谢 !!