C / C ++套接字和无阻塞recv

问题描述

| 我遇到一个问题,即调用recv()系统调用不会阻塞。目前,我有一个客户端-服务器结构设置,而我遇到的问题是,在服务器设置好后,我向服务器发送了一条消息,如下所示:
while (1) {
   char buf[1024];
   recv(fd,buf,sizeof(buf),flags);
   processMsg(buf);
}
它正确接收了第一条消息,但是recv()不会阻止并且“接收”垃圾数据,这不是所希望的。我只想在邮件发送后对其做出反应。有人可以建议吗?     

解决方法

        recv()不一定会在满足完整请求之前阻塞,但可以返回部分请求。返回代码将通知您实际接收了多少个字节,该字节数可能少于您请求的字节数。即使您指定了MSG_WAITALL标志,由于信号等原因,它返回的内容也会更少。 在posix系统上,在阻塞模式下,recv只会阻塞,直到出现一些要读取的数据为止。然后,它将返回该数据,该数据可能少于请求的数据,最高为请求的数量。在非阻塞模式下,如果要读取的字节数为零,则recv将立即返回并返回-1,将errno设置为EAGAIN或EWOULDBLOCK。 结果是,通常您将循环调用recv直到获得所需的数量,同时还要检查返回代码0(另一侧断开)或-1(某些错误)。 我不能说Windows的行为。     ,        有两种可能:发生错误,或者套接字设置为非阻塞模式。要查看是否发生错误,请检查返回值
recv
while() {
    char buf[1024];
    int ret = recv(,buf,)

    if(ret < 0) {
        // handle error
        printf(\"recv error: %s\\n\",strerror(errno));
    } else {
        // only use the first ret bytes of buf
        processMsg(buf,ret);
    }
}
要将套接字置于非阻塞模式,或者查询套接字是否处于非阻塞模式,请使用带有
O_NONBLOCK
标志的
fcntl(2)
// Test if the socket is in non-blocking mode:
if(fcntl(sockfd,F_GETFL) & O_NONBLOCK) {
    // socket is non-blocking
}

// Put the socket in non-blocking mode:
if(fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFL) | O_NONBLOCK) < 0) {
    // handle error
}
请注意,除非您显式更改阻止行为,否则默认情况下套接字应处于阻止状态,因此很可能发生错误。     ,        如果您使用的是Windows,请运行wsagetlasterror()函数并查看返回值。 http://msdn.microsoft.com/zh-cn/library/ms741580%28v=vs.85%29.aspx 如果您使用的是posix兼容系统,请查看errno http://pubs.opengroup.org/onlinepubs/009695399/functions/errno.html     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...