草庐IT

zmq_recv

全部标签

linux - EBADF while recv after epoll_wait

我遇到了以下问题:我有一个接收连接的epoll代码:while(1){intnfds=epoll_wait(epollfd,events,4096,-1);if(nfds==-1){if(errno==EINTR)continue;perror("epoll_wait");exit(EXIT_FAILURE);}for(inti=0;idisconnectDriver(events[i].data.fd);}#elseif(events[i].events&EPOLLHUP){std::coutdisconnectDriver(events[i].data.fd);}#endifif(

c - socket send和recv中FLAG的含义

在Linux手册页中搜索时,我发现关于socket中send和recv的格式如下:发送,ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);对于接收,ssize_trecv(intsockfd,void*buf,size_tlen,intflags);但我不确定他们试图讲述有关intflags的内容。在一个示例代码中,我发现标志的值为0(零)。这是什么意思?另外,手册页中下面一行的含义是什么?"TheflagsargumentisthebitwiseORofzeroormoreofthefollowingflags."然后是标

linux - 所选套接字上的套接字 recv 因 etimedout 而失败

我正在使用以下代码片段编写一个服务器-客户端程序来接收数据。ret_l=select(readfds+1,&readfds,NULL,NULL,NULL);if(ret_l!=-1){if(FD_ISSET(myfd,&readfds)){ret_l=recv(myfd,buf,size_of_buf_array,0);if(ret_l==-1)return;}}据我所知,select()ed文件描述符上的recv应该会无误地接收数据。但是我的代码中的recv失败并出现错误ETIMEDOUT。有人请告诉我为什么会这样。还请告诉我一些解决方法,即使在ETIMEDOUT之后也能完全接收数据

c++ - 如何使用 recv() 在 C++ 套接字中接收超过 65000 个字节

我正在使用C++在Linux中开发客户端服务器应用程序(TCP)。我想同时发送超过65,000个字节。在TCP中,最大数据包大小仅为65,535字节。我怎样才能不丢失地发送整个字节?以下是我在服务器端的代码。//Receivethemessagefromclientsocketif((iByteCount=recv(GetSocketId(),buffer,MAXRECV,MSG_WAITALL))>0){printf("\nReceivedbytes%d\n",iByteCount);SetReceivedMessage(buffer);returnLS_RESULT_OK;}如果我

c - recv() 接收部分消息的套接字编程问题

我有一个正在接收流式股票报价数据的套接字。但是,我似乎收到了很多截断的消息,或者看起来像是截断的消息。这是我接收数据的方式:if((numbytes=recv(sockfd,buf,MAXDATASIZE-1,0))==-1){perror("recv()");exit(1);}else{buf[numbytes]='\0';//Processdata}recv()能否仅接收已发送内容的部分消息?我的感觉是我可能需要围绕接收的recv()调用进行另一个循环,直到发送完整的消息。我知道我有一个libcurl实现(我认为不可能在这里使用libcurl)有一个外循环://Readtheres

c++ - 尽管 KEEPALIVE,TCP、recv 函数仍挂起

TCPkeepalive(超时时间短)是否会阻止客户端在服务器死机后卡在recv上?场景:服务器和客户端运行在不同的机器上:客户端使用KEEPALIVE选项通过TCP连接到服务器客户端发送“Helloserver”并等待响应服务器收到“Helloserver”并响应“Helloclient”客户端收到响应,休眠10秒并重复步骤2-4(现在跳过步骤1-保留连接)在客户端休眠期间,服务器被关闭,现在:客户醒来发送“Helloserver”并等待响应20分钟后recv放弃-我原以为KEEPALIVE会在45秒后中断recv功能:设置KEEPALIVE选项:voidTCPclient::set

c++ - recv 有时接收不到全部数据

我有以下问题:这是代码块:voidget_all_buf(intsock,std::string&inStr){intn=1;charc;chartemp[1024*1024];bzero(temp,sizeof(temp));n=recv(sock,temp,sizeof(temp),0);inStr=temp;};但有时recv不返回整个数据(数据长度总是小于sizeof(temp)),只返回它的一部分。写端总是向我发送完整数据(我用嗅探器得到它)。有什么关系?谢谢。P.S.我知道,礼貌建议我查看n(if(n),但现在没关系-这不是我的问题的原因。P.S.2我忘了-它会阻塞套接字。

c++ - 为什么在调用recv系统调用时会调用sigprocmask?

我有一些定期调用recv()的代码(带有MSG_DONTWAIT标志)。我很好奇,因为在vtune中分析我的代码时,我看到一个与recv()关联的sigprocmask()调用,它占用了总时间的很大一部分执行。我很好奇为什么recv()调用sigprocmask()。 最佳答案 在linux下使用TCP套接字时,如果另一端意外关闭,您将收到SIGPIPE。因为你可以屏蔽这个信号(大多数时候,你会自己处理返回值0,你不关心这个信号),我猜测系统库检查信号状态,如果被屏蔽,则使用更快的代码路径。如果不是,则无法优化。顺便说一句,你知道p

c - 给定任何 epoll TCP 套接字事件,如果 EPOLLRDHUP=0 且 EPOLLIN=1;后续调用 read()/recv() 是否保证返回不等于 0 的读取大小?

摘自epoll_ctl的手册:EPOLLRDHUP(sinceLinux2.6.17)Streamsocketpeerclosedconnection,orshutdownwritinghalfofconnection.(ThisflagisespeciallyusefulforwritingsimplecodetodetectpeershutdownwhenusingEdgeTriggeredmonitoring.)来自recv的手册:Ifnomessagesareavailabletobereceivedandthepeerhasperformedanorderlyshutdown

linux - 在 amazon linux 上安装 zmq 时出现问题(无法找到 uuid)

我正在尝试在EC2上组装一个AMI,目前在构建0mq上停滞不前。最初,我在运行./configure时遇到此错误checkingforuuid_generatein-luuid...noconfigure:error:cannotlinkwith-luuid,installuuid-dev.我通过yum安装了e2fsprogs-devel和linux-utils,我相信它包含了所需的库,但仍然出现上述错误。我随后用yum安装了uuid-devel,但没有进一步。然后,我创建了如下链接:sudoln-s/lib64/libuuid.so.1.3.0/lib64/libuuid.so现在.