【发布时间】:2020-02-22 02:13:05
【问题描述】:
我有一个套接字,它等待接收,然后在接收到数据后,向前发送数据进行处理。但是,它再次执行 recv,这一次它什么也没收到,返回 -1,当打印 errno 时,它打印 35(即EAGAIN)。
这只发生在 MAC OS Lion 操作系统上,对于其他操作系统,它运行得非常好
do{
rc = recv(i, buffer, sizeof(buffer), 0);
if (rc < 0){
printf("err code %d", errno);
}
if(rc == 0){
//Code for processing the data in buffer
break;
}
....
}while(1);
编辑:更正缩进和错误码
【问题讨论】:
-
ESRCH是recv()调用的不寻常错误。这是一个普通的网络(例如IP)套接字还是带有“特殊”协议的套接字,如netlink。另外,请注意您的缩进。虽然不是这样,但您的if(rc == 0){ ... }块似乎在if (rc < 0){ ... }块内,这不可能工作。 -
@Celada - 很抱歉应该是 errno 35,抱歉打错了...
-
无论错误代码是什么,如果可以,请发布错误的名称而不是数字代码。你标记了你的问题osx,所以我在 MacOS 上查找数值,35 是
EAGAIN,但它不一定在每个操作系统上都相同。但是这些名称(总的来说)在操作系统中具有相同的含义。通过给出错误的名称,您将使一些无法访问 MacOS 系统的人能够帮助您,以便他们自己发现。 -
EGAIN表示内核没有数据可以提供给您的接收缓冲区。在发布recv()之前对您的套接字文件描述符执行select()调用怎么样? -
你是否将套接字设置为非阻塞模式?