C++ C++;:即使发送了数据,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

我有两个线程在我的程序中运行。一个正在向另一个发送数据。套接字在两个线程上都连接良好,接收线程正在接受连接。然而,一旦调用recv,它就只是坐在那里阻塞,好像它什么也没得到一样,尽管另一个线程正在发送

发送线程

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()不可能打印您声称打印的内容。显然,这不是真正的代码。