我有一个客户端,需要在套接字上读取服务器发送的字符序列。客户端使用系统读取-调用read() a socket 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‘。从这个角度来看,一切都很好。
提前感谢所有人。
发布于 2020-07-22 01:02:44
使用数据报套接字,您需要一次读取和写入整个数据报。
如果您没有给read足够的空间来读取整个数据报,那么数据报的其余部分就会消失。
int datagram_length = read(sockd, vptr, maxlen - 1);
if (datagram_length < 0) {
// complain about the error
} else {
vptr[datagram_length] = 0;
}https://stackoverflow.com/questions/63019247
复制相似问题