我在从服务器上的客户端读取数据时遇到问题。读取所有数据后,read() 函数将始终卡住(阻塞)并等待更多数据,这对我来说是不受欢迎的。
服务器程序:
soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = INADDR_ANY;
bind(soc, (struct sockaddr*) &sin, sizeof(sin));
if (listen(soc, MAX))
return;
int socc; // socket for clinet
while (1) {
if ((socc = accept(soc, (struct sockaddr *) &sin, sinlen)) < 0)
break;
while ((result = read(socc, pointer, SIZE)) > 0) {
// after the data are readed, read function will block
}
// do some stuff and write reply to client => will never done
}
客户端程序:
...
soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
struct sockaddr_in socketAddr;
socketAddr.sin_family = AF_INET;
socketAddr.sin_port = htons(port);
memcpy(&(socketAddr.sin_addr), host->h_addr, host->h_length);
if (connect(soc, (sockaddr *)&socketAddr, sizeof(socketAddr)) == -1)
return;
if (write(soc, req.c_str(), strlen(req.c_str())) < 0)
return;
主要问题是我不知道客户端将向服务器发送多少数据,所以服务器应该从套接字读取所有数据,在没有任何数据后,离开读取周期。但是服务器读取了整个消息(例如 30 字节)并等待更多(但没有更多)。套接字仍处于打开状态,因为客户端正在等待服务器的回复。
最佳答案
您需要使您的套接字成为非阻塞的。在这种情况下,如果没有任何内容可读取并出现特定错误,读取将立即退出。
关于c++ - 从套接字卡住中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15319267/