gpt4 book ai didi

sockets - 套接字编程: why are the behaviors of recv() and read() not the same?

转载 作者:行者123 更新时间:2023-12-03 12:06:30 25 4
gpt4 key购买 nike

我使用select()从stdin接收数据。

代码在这里:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
int main()
{
fd_set rfds;
struct timeval tv;
int retval;
char buf[100];

FD_ZERO(&rfds);
FD_SET(STDIN_FILENO, &rfds);

tv.tv_sec = 5;
tv.tv_usec = 0;

retval = select(1,&rfds,0,0,&tv);

if( retval == -1)
perror("select reset\n");
else if(retval == 0)
printf("timeout\n");
else
{
printf("data available\n");
if(FD_ISSET(STDIN_FILENO, &rfds))
{
//int ret = recv(STDIN_FILENO, buf, sizeof(buf), 0); // ret get -1.
int ret = read(STDIN_FILENO, buf, sizeof(buf)); // ret get correct data.
printf("buf: %s ret: %d\n", buf,ret);
}
}
return 0;
}

在此代码中, recv()将始终返回 -1,但 read()可以获取正确的数据。

我发现 read()等效于 recv()参数为 flags0。为什么在我的代码中 recv()read()的行为不同?

最佳答案

因为recv()是在套接字上使用的,而不是像stdin这样的通用文件描述符。套接字可以像任何描述符一样对待,但是描述符不一定在其后有套接字(对于stdin而言,它们没有)。

在那段特定的代码中,我怀疑如果您检查errno,它将具有EINVAL或类似的值。

关于sockets - 套接字编程: why are the behaviors of recv() and read() not the same?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6893748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com