2014-11-27 2 views
1

나는 wifi를 통해 클라이언트를 통해 연결을 허용하는 서버 코드를 작성했습니다. wifi 소켓은 ttyAMA0으로 표시되는 Wifi Dongle에서 열립니다.소켓에서 연결 해제를 감지 할 수 없습니다.

나는 소켓을 만들

내 리더 THR 중 하나

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); 
 
       ... 
 
     ... 
 
     }
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는 원격 연결이 꺼져 있는지 감지합니다. Android 휴대 전화에서 Wi-Fi를 사용 중지하면 내장 된 컴퓨터의 코드가 중지됩니다.

휴대 전화에서 Wi-Fi를 켜고 소켓에 연결할 수 있지만 아직 데이터가 전송되지 않습니다.

  1. 나는 recv 대신에 읽으려고했지만 아무런 차이가 없었습니다.
  2. TCPALIVE 옵션도 시도했습니다. 여전히 작동하지 않습니다.
  3. 나는 내가 해제 SO_RCVTIMEO을 사용

serv_addr.sin_addr.s_addr = WLAN;

+2

'recv()'는 네트워크 중단을 감지 할 의무가 없습니다. TCP/IP는주의 깊게 설계되었으므로 필요하지 않습니다. SO_RCVTIMEO를 통해 읽기 시간 초과를 사용해야합니다. – EJP

+0

감사합니다 EJP It Worked ... 그럭저럭 벗어날 수있었습니다. :) – RootPhoenix

답변

1

EJP '제안 당으로 작성해야 어떤 경우에 .... INADDR_ANY를 제거하고 무선 랜을 위해 특별히 작성해야 내 편에서의 연결.

관련 문제