Есть две возможности: либо происходит ошибка, либо сокет установлен в неблокирующий режим.Чтобы увидеть, происходит ли ошибка, проверьте возвращаемое значение recv
:
while() {
char buf[1024];
int ret = recv(,buf,,)
if(ret < 0) {
// handle error
printf("recv error: %s\n", strerror(errno));
} else {
// only use the first ret bytes of buf
processMsg(buf, ret);
}
}
Чтобы перевести сокет в неблокирующий режим или запросить, находится ли сокет в неблокирующем режиме, используйтеfcntl(2)
с флагом O_NONBLOCK
:
// Test if the socket is in non-blocking mode:
if(fcntl(sockfd, F_GETFL) & O_NONBLOCK) {
// socket is non-blocking
}
// Put the socket in non-blocking mode:
if(fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL) | O_NONBLOCK) < 0) {
// handle error
}
Обратите внимание, что если вы явно не изменяете поведение блокировки, сокет должен блокировать по умолчанию, поэтому, скорее всего, ошибкапроисходит.