Пара вопросов знающим людям:
1) Что делает fcntl(sock, F_SETFL, O_NONBLOCK) с дескриптором на самом низком уровне? Просто флаг устанавливает?
2) O_NONBLOCK действует только на Send/Write и Recv/Read, или распространяется на всю работу с дескриптором?
3) Если errno устанавливается в EAGAIN при наличии возможности блокирования, то почему это ошибка?
4) Правильно ли игнорировать EAGAIN?
5) Как это действует на select/poll?
Red Hat Linux release 6.2 (Zoot)
Linux 2.2.24-6.2.3 i686
Вобщем, я столкнулся с неустойчивым приемом данных через
неблокирующий сокет (), например, пропадают пакеты или
приходят в искаженном виде. Особенно, это проявляется при
двойном вызове recv, т.е. сначала принимаем размер пакета,
а потом сам пакет.
Send size ---> Recv size
Send data ---> Recv data
Псевдокод Send/Recv:
int [Send/Recv](sock, void* buf, int size)
{
int count = 0, bytes = -1;
... проверка параметров ...
while(count < size)
{
bytes = [send/recv](sock, buf + count, size - count, 0);
if(bytes < 0)
{
if(errno == EAGAIN)
break;
return -1;
}
count += bytes;
}
return count;
}
Даже если отлавливать события POLLIN в poll,
то пакет или искажается или теряется:
int HandleRecv(int sock, void* buf, int size)
{
int status = -1, bytes = 0;
struct pollfd fds[1];
... проверка параметров ...
fds[0].fd = sock;
fds[0].events = POLLIN;
if( (status = poll(fds, 1, 10000)) > 0 )
{
if( fds[0].revents & POLLIN ) {
bytes = Recv(sock, buf, size);
} else if( fds[0].revents & POLLHUP ) {
return -1;
} else if( fds[0].revents & POLLNVAL ) {
return -1;
} else if( fds[0].revents & POLLERR ) {
return -1;
}
} else {
return -1;
}
return bytes;
}
Похожие темы
- Форум Помогите разобраться с zeromq сокетами (2014)
- Форум Сокеты, Передача данных, C/C++ (2006)
- Форум Сокеты: segfault при копировании char* в std::string (2014)
- Форум Баги в select! (2003)
- Форум сваливается send (сокет) (2008)
- Форум Производительность AF_PACKET RAW и AF_INET SOCK_STREAM сокетов в ядре. (2010)
- Форум Сокеты (2019)
- Форум Особенности работы с poll (2020)
- Форум poll после send (2017)
- Форум Консольный обмен сообщениями (2017)