系统调用 read() 阻塞
System-call read() blocked
我有一个客户端需要在套接字上读取服务器发送的字符序列。
客户端使用系统调用 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 == '[=10=]') break;
}
else
{
if (errno == EINTR) continue;
return -1;
}
}
*buffer = 0;
return n;
}
问题是,如果服务器发送像这样的 ABCDEF'\0' 的字符序列,则此客户端只读 A,然后系统调用 read() 进入阻塞模式。
我已经使用 Wireshark 查看服务器是否运行良好,它是否在 UDP 数据包中正确发送 ABCDEF'\0'。从这个角度来看都还可以。
在此先感谢大家。
使用数据报套接字,您需要一次读取和写入整个数据报。
如果您没有给 read
足够的 space 来读取整个数据报,数据报的其余部分就会消失。
int datagram_length = read(sockd, vptr, maxlen - 1);
if (datagram_length < 0) {
// complain about the error
} else {
vptr[datagram_length] = 0;
}
我有一个客户端需要在套接字上读取服务器发送的字符序列。 客户端使用系统调用 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 == '[=10=]') break;
}
else
{
if (errno == EINTR) continue;
return -1;
}
}
*buffer = 0;
return n;
}
问题是,如果服务器发送像这样的 ABCDEF'\0' 的字符序列,则此客户端只读 A,然后系统调用 read() 进入阻塞模式。 我已经使用 Wireshark 查看服务器是否运行良好,它是否在 UDP 数据包中正确发送 ABCDEF'\0'。从这个角度来看都还可以。
在此先感谢大家。
使用数据报套接字,您需要一次读取和写入整个数据报。
如果您没有给 read
足够的 space 来读取整个数据报,数据报的其余部分就会消失。
int datagram_length = read(sockd, vptr, maxlen - 1);
if (datagram_length < 0) {
// complain about the error
} else {
vptr[datagram_length] = 0;
}