Я написал код сервера, который принимает соединение через клиента через Wi-Fi. Разъем Wi-Fi открывается на Wifi Dongle, который отображается как ttyAMA0.Сокет не может обнаружить разъединение
Я создаю сокет
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
Тогда я обычный принимаю ...
while(1)
{
new_fd = accept(sfd,(struct sockaddr*)&client_addr,&len);
...
...
}
и в одном из моего читателя Thr EADS Я делаю это:
void* Command2Buff(void *args)
{
...
while(1)
{
....
clientBytes = recv(str_fd.new_conn_fd,&temp,1);
if(clientBytes == 0 || clientBytes == -1)
{
...
}
globalCmdbuf[wr] = temp;
}
}
Так RECV должен обнаружить, что удаленное соединение выключилась. Когда я выключаю Wi-Fi с моего телефона Android, код на встроенной машине просто зависает.
Включите Wi-Fi на телефоне, и я могу подключиться к сокете, но нет передачи данных.
- Я пробовал читать вместо recv, но не имел никакого значения.
- Я также пробовал вариант TCPALIVE .. пока не работает.
- Должен ли я удалить INADDR_ANY и писать специально для БЛС .... в этом случае то, что я должен написать
serv_addr.sin_addr.s_addr = WLAN;
'recv()' не обязан обнаруживать сбои в сети. TCP/IP тщательно разработан, поэтому нет необходимости. Вы должны использовать таймаут чтения через SO_RCVTIMEO. – EJP
Спасибо EJP It Worked ... удалось выйти из него. :) – RootPhoenix