2014-11-27 3 views
1

Я написал код сервера, который принимает соединение через клиента через 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 на телефоне, и я могу подключиться к сокете, но нет передачи данных.

  1. Я пробовал читать вместо recv, но не имел никакого значения.
  2. Я также пробовал вариант TCPALIVE .. пока не работает.
  3. Должен ли я удалить INADDR_ANY и писать специально для БЛС .... в этом случае то, что я должен написать

serv_addr.sin_addr.s_addr = WLAN;

+2

'recv()' не обязан обнаруживать сбои в сети. TCP/IP тщательно разработан, поэтому нет необходимости. Вы должны использовать таймаут чтения через SO_RCVTIMEO. – EJP

+0

Спасибо EJP It Worked ... удалось выйти из него. :) – RootPhoenix

ответ

1

В соответствии с предложениями EJP»Я SO_RCVTIMEO, чтобы выключить соединение с моей стороны.

Смежные вопросы