由于规格要求,不允许使用recv()或类似函数从套接字的fd中读取。我想知道如何使用read()重新制作该函数?
我尝试使用以下代码创建它
int recvFromFd(int connectionFd, char *buf, int size)
{
char c;
int i = 0;
for (read(connectionFd, &c, 1); i < size; i++)
{
buf[i] = c;
if (c == '\n' || read(connectionFd, &c, 1) == EOF)
break;
}
return i;
}
此代码在一定程度上有效,但是通常在发件人接连发送一条消息时,该函数同时将这两个消息读取到同一缓冲区(附加)。
答案 0 :(得分:0)
您可以在Unix上使用read(2)代替recv(2)(但是我不确定它是否可以在Windows上运行,那里没有read()函数)。但是read()函数有一些限制:
您无法获取对等方的地址(如果使用UDP协议);
您不能接收大小为零的数据报(UDP);
您不能通过Unix域套接字传递文件描述符;
您不能使用用于从内核获取网络配置的特殊套接字类型(AF_NETLINK域,SOCK_SEQPACKET套接字类型)。
Linux联机帮助页说:
recv()和read(2)之间的唯一区别是存在 标志。使用零标志参数时,recv()通常等效于 读(2)。
我认为,对于TCP协议,使用read(2)或recv(2)几乎没有区别。
答案 1 :(得分:0)
所以我最终完成了以下工作,并且可以正常工作。
int recvFromFd(int connectionFd, char *buf, int size)
{
char c;
int i = 0;
for (read(connectionFd, &c, 1); i < size && c != '\n'; i++)
{
buf[i] = c;
read(connectionFd, &c, 1);
}
buf[i] = '\0';
if (debugMode)
printf("\n>Incoming from socket: %s\n", buf);
return i; // how many was read
}