【发布时间】:2020-11-11 02:42:48
【问题描述】:
我有一个客户端需要在套接字上读取服务器发送的一系列字符。 客户端使用系统调用 read() 读取套接字 SOCK_DGRAM。
这里是完整的函数,里面有系统调用 read(..)。
ssize_t readLine(int sockd, void *vptr, size_t maxlen)
{
ssize_t n, rc;
char c, *buffer;
buffer = vptr;
for ( n = 1; n < maxlen; n++ )
{
rc = read(sockd, &c, 1);
if ( rc == 1 )
{
*buffer++ = c;
if (c == '\0') break;
}
else
{
if (errno == EINTR) continue;
return -1;
}
}
*buffer = 0;
return n;
}
问题是,如果服务器发送一个像 ABCDEF'\0' 这样的字符序列,这个客户端只读取 A,然后系统调用 read() 进入阻塞模式。 我已经使用 Wireshark 来查看服务器是否运行良好,并且它在 UDP 数据包中正确发送了 ABCDEF'\0'。从这个角度来看一切都很好。
在此先感谢大家。
【问题讨论】:
-
你需要一次读取整个数据报
-
如何知道数据报的维度?每次都不一样。
-
@ABC 这是你的协议——你决定每个数据报包含什么——所以你可以决定最大值。您指定可以收到多少,预先设定的最大值。如果发送的更少,您将获得更少。
recv/read会告诉你收到了多少。 -
如果我阅读的内容多于发送的内容会怎样?
-
一次读取的字节数不能超过数据报的大小。
标签: c sockets unix system-calls