Моя система — C ++ на ARM под управлением Ubuntu.
У меня возникают некоторые проблемы с сокетами Berkley, когда я пытаюсь выполнить блокировку чтения, я получаю сообщение об ошибке, и код EAGAIN. Я вставил таймер в код и обнаружил, что ошибка происходит до истечения времени ожидания сокета. Я смотрю на устройство, которое я подключаю тоже и розетка не закрылась.
Я не знаю, как это связано, но похоже, что это происходит только тогда, когда я запускаю программу под GDB … по крайней мере, это единственный раз, когда я заметил это.
Вот упрощенная версия кода. Я убрал проверку ошибок, чтобы сделать ее меньше.
int optval;
struct timeval tv;
// Set up the sockaddrIn structures for the port
struct sockaddr_in controlTcpAddr;
memset(&controlTcpAddr, 0, sizeof(controlTcpAddr)); // Clear struct
controlTcpAddr.sin_family = AF_INET; // Internet/IP
controlTcpAddr.sin_addr.s_addr = inet_addr(hostIp); // IP address
controlTcpAddr.sin_port = htons(hostPort); // server port
// Create the TCP socket
myControlTcpSockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
// Establish connection
connect(myControlTcpSockDesc, (struct sockaddr *) &controlTcpAddr, sizeof(controlTcpAddr);
int flags = fcntl(myControlTcpSockDesc, F_GETFL);
int result = fcntl(myControlTcpSockDesc, F_SETFL, flags & ~O_NONBLOCK);
// Set the SO_REUSEADDR option for the socket
optval = 1;
setsockopt(myControlTcpSockDesc, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)
tv.tv_sec = 10; // 10 Secs Timeout
tv.tv_usec = 0;
setsockopt(myControlTcpSockDesc, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval));
// try a read
cnt = read(myControlTcpSockDesc, myIncomingMsgBuf, MESSAGE_BUFFER_SIZE);
// at this point I find that 10 seconds have not expired
// (I have separate timer running that is not shown)
// cnt = -1
// errno = EAGAIN
Задача ещё не решена.