C++ C++;:即使发送了数据,Recv仍将永久阻塞
我有两个线程在我的程序中运行。一个正在向另一个发送数据。套接字在两个线程上都连接良好,接收线程正在接受连接。然而,一旦调用recv,它就只是坐在那里阻塞,好像它什么也没得到一样,尽管另一个线程正在发送 发送线程C++ C++;:即使发送了数据,Recv仍将永久阻塞,c++,sockets,C++,Sockets,我有两个线程在我的程序中运行。一个正在向另一个发送数据。套接字在两个线程上都连接良好,接收线程正在接受连接。然而,一旦调用recv,它就只是坐在那里阻塞,好像它什么也没得到一样,尽管另一个线程正在发送 发送线程 send(orig_sock, buf, BUFSIZ,0); printf("Client sending chunk\n"); printf("START ACCEPTING\n"); if ((new_sock = accept( orig_sock, (stru
send(orig_sock, buf, BUFSIZ,0);
printf("Client sending chunk\n");
printf("START ACCEPTING\n");
if ((new_sock = accept( orig_sock, (struct sockaddr *) &clnt_adr, &clnt_len)) < 0) {
perror("accept error");
close(orig_sock);
return NULL;
}
printf("PASS ACCEPT\n");
if ( fork( ) == 0 ) { // Generate a CHILD
printf("FORK\n");
len=recv(new_sock, buf, BUFLEN,0 );
printf("message received");
receiveBuffer.push(*p);
//write(new_sock, buf, len);
//if ( buf[0] == '.' ) break;
printf("Did not receive message\n");
close(new_sock);
return NULL;
} else
close(new_sock);
printf设法得到显示
接收线程
send(orig_sock, buf, BUFSIZ,0);
printf("Client sending chunk\n");
printf("START ACCEPTING\n");
if ((new_sock = accept( orig_sock, (struct sockaddr *) &clnt_adr, &clnt_len)) < 0) {
perror("accept error");
close(orig_sock);
return NULL;
}
printf("PASS ACCEPT\n");
if ( fork( ) == 0 ) { // Generate a CHILD
printf("FORK\n");
len=recv(new_sock, buf, BUFLEN,0 );
printf("message received");
receiveBuffer.push(*p);
//write(new_sock, buf, len);
//if ( buf[0] == '.' ) break;
printf("Did not receive message\n");
close(new_sock);
return NULL;
} else
close(new_sock);
printf(“开始接受”);
如果((新sock=accept(原始sock,(结构sockaddr*)和clnt\U adr,&clnt\U len))<0){
perror(“接受错误”);
关闭(原袜子);
返回NULL;
}
printf(“通过接受”);
如果(fork()==0){//生成一个子对象
printf(“FORK\n”);
len=recv(新袜子,buf,BUFLEN,0);
printf(“收到的消息”);
接收缓冲推送(*p);
//写(新的袜子、布、蓝);
//如果(buf[0]='.')中断;
printf(“未收到消息\n”);
关闭(新袜子);
返回NULL;
}否则
关闭(新袜子);
直到“FORK”为止的所有消息都被显示,thrad挂起recv调用。buf定义为静态字符buf[BUFSIZ]代码>
recv呼叫看不到任何数据的原因是什么
send(orig_sock, buf, BUFSIZ,0);
及
if((new\u sock=accept(orig\u sock,(struct sockaddr*)和clnt\u adr,&clnt\u len))<0){
两者之间没有任何意义。要么是连接了orig_sock
,要么它正在侦听。不是两者都有。您在send()
上缺少错误检查,掩盖了此错误
您无法发送到侦听套接字。什么是send()
return在这种情况下?send
和accept
使用相同的套接字?为什么要使用套接字进行线程间通信?有更有效的方法在同一进程的线程之间传递数据。我修改了代码,开始打印send的返回值。看起来好像有什么东西正在发送(orig_sock在两个代码段中的定义不同)。新代码int bl=send(orig_sock,buf,BUFSIZ,0);
printf(“客户端发送块:%d\n”,clientNum,bl);
输出客户端发送区块:8192
客户端发送区块:-1
因此,它尝试发送两个不同的区块。第一个看起来像它发送的,第二个没有。使用errno
(或Windows上的WSAGetLastError()
找出原因发送()
失败。但您绝对不能将发送()
到正在连接的接受()
套接字。您必须将发送()
到已接受的套接字。@ToxicSockWarrior,printf()不可能打印您声称打印的内容。显然,这不是真正的代码。