由于规范要求,我不允许使用recv()或类似的函数来读取socket的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;
}
此代码在某种程度上起作用,但通常当发送方一个接一个地发送一条消息时,该函数同时将这两条消息读取到同一个缓冲区(追加)。
您可以在Unix上使用read(2)代替recv(2)(但我不确定它是否适用于Windows,其中没有read()函数)。但read()函数有一些局限性:
Linux手册页说:
recv()和read(2)之间的唯一区别是标志的存在。使用零标志参数,recv()通常等效于read(2)。
我认为,对于TCP协议,使用read(2)或recv(2)几乎没有区别。
所以我最终做了以下工作。
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
}