C++:尽管发送了数据,但 Recv 永远阻塞

Posted

技术标签:

【中文标题】C++:尽管发送了数据,但 Recv 永远阻塞【英文标题】:C++: Recv blocking forever despite data being sent 【发布时间】:2013-06-07 07:36:25 【问题描述】:

我的程序中有两个线程正在运行。一个是向另一个发送数据。套接字在两个线程上都连接良好,并且接收线程正在接受连接。但是,一旦调用了 recv,它就会像什么都没有进入一样阻塞在那里,尽管事实上另一个线程正在发送。

发送线程

send(orig_sock, buf, BUFSIZ,0);
printf("Client sending chunk\n");

printf 设法显示出来。

接收线程

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);      

直到 "FORK" 的所有消息都被显示,并且线程挂在 recv 调用上。 buf 定义为static char buf[BUFSIZ]; recv 调用看不到任何数据的任何原因?

【问题讨论】:

send() 在这种情况下返回什么? sendaccept 使用同一个套接字? 为什么要使用套接字进行线程间通信?在同一进程的线程之间传递数据有更有效的方法。 【参考方案1】:
send(orig_sock, buf, BUFSIZ,0);

if ((new_sock = accept( orig_sock, (struct sockaddr *) &clnt_adr, &clnt_len)) < 0) 

在一起没有意义。 orig_sock 已连接或正在侦听。不是都。您对send() 缺乏错误检查正在掩盖此错误。

你不能发送到监听套接字。

【讨论】:

我修改了我的代码,开始打印发送的返回值。看起来好像有东西被发送了(orig_sock 在两个代码 sn-ps 中的定义不同)。新代码 int bl = send(orig_sock, buf, BUFSIZ,0); printf("Client sending chunk: %d\n", clientNum, bl); 输出 Client sending chunk: 8192 Client sending chunk: -1 所以,它尝试发送两个不同的块。第一个看起来像它发送,而第二个没有。 使用errno(或Windows 上的WSAGetLastError())找出send() 失败的原因。但是您绝对不能将send() 连接到与accept() 连接的同一个套接字。你必须 send()accept()'ed 的套接字。 @ToxicSockWarrior 那 printf() 不可能打印你声称它打印的东西。显然这不是真正的代码。

以上是关于C++:尽管发送了数据,但 Recv 永远阻塞的主要内容,如果未能解决你的问题,请参考以下文章

如何在 linux C 中解除对 recv() 或 recvfrm() 函数的阻塞

Linux Socket

linux机制

是否有可能以某种方式同时在 ZMQ 中使用 Send/Recv(通过多线程)?

线程中阻塞 MPI_Recv 的 CPU 使用率

为啥 sys socket recv 函数不填充数据但返回字节长度?