2017-11-08 1 views
0

클라이언트는 크로스 플랫폼 응용 프로그램 (안드로이드 & IOS) 나는 성공적으로 서버에 있지만이 서버 RECV 함수가 0을 반환 한 후 연결C# 클라이언트 C로 ++ 서버의 TCP 소켓 연결 오류

(C#을) 서버는 윈도우입니다. (C++)입니다 진지하게. 하지만 서버를 C++ 클라이언트에 연결하려고하면이 문제가 발생하지 않습니다.

그리고 recv 함수가 0을 반환 할 때 "계속"하고 싶지 않습니다. recv가 0을 반환하면

버튼에 클라이언트 코드를 추가했습니다. 버튼을 클릭하면 소켓이 닫힙니 까?

클라이언트 C# 코드 :

private static async void ConnectAsTcpClient() 
    { 

      using (var tcpClient = new TcpClient()) 
      { 
       //Console.WriteLine("[Client] Connecting to server"); 
       await tcpClient.ConnectAsync("127.0.0.1", 12312); 
       Console.WriteLine("[Client] Connected to server"); 
      } 

    } 

서버 C++ 코드 : 소켓 양말;

// for our thread 
DWORD thread; 

WSADATA wsaData; 
sockaddr_in server; 

// start winsock 
int ret = WSAStartup(0x101, &wsaData); // use highest version of winsock avalible 

if (ret != 0) 
{ 
    return 0; 
} 

// fill in winsock struct ... 
server.sin_family = AF_INET; 
server.sin_addr.s_addr = INADDR_ANY; 
server.sin_port = htons(12312); // listen on telnet port 23 

           // create our socket 
sock = socket(AF_INET, SOCK_STREAM, 0); 

if (sock == INVALID_SOCKET) 
{ 
    return 0; 
} 

// bind our socket to a port(port 123) 
if (bind(sock, (sockaddr*)&server, sizeof(server)) != 0) 
{ 
    return 0; 
} 

// listen for a connection 
if (listen(sock, 5) != 0) 
{ 
    return 0; 
} 

// socket that we snedzrecv data on 
SOCKET client; 

sockaddr_in from; 
int fromlen = sizeof(from); 
printf("Server Started\n"); 
client = accept(sock, (struct sockaddr*)&from, &fromlen); 
printf("Client connected\r\n"); 

while (true) 
{ 
    res = recv(current_client, buf, sizeof(buf), 0); // recv cmds 


    // multi Thread 
    Sleep(30); 

    if (res == 0 || res >= 150) 
    { 
     printf("Recv Failed! = %d\n", res); 
     continue; 
    } 

답변

0

클라이언트 아무것도 기록하지 않는 대신 그것은 tcpClient 객체가 서버에 0를 반환 recv로 이어지는 연결이 끊어 범위 밖으로 이동 할 수 있습니다.

그런데 recv 전화 (res == SOCKET_ERROR)에서 실제 오류를 확인하는 것을 잊었습니다.

+0

안드로이드 서버의 애플리케이션을 닫을 때 클라이언트가 0을 계속 수신 할 때 클라이언트에 문제가 있다고 생각합니다. 따라서 클라이언트 소켓 연결이 끊어졌지만 IDK로 문제를 해결해야합니다. –

+0

@ismetJM'recv'가'0'을 반환하면, 다른 쪽 끝이 연결을 닫았 음을 의미합니다. 그런 다음 연결의 끝을 닫고 새 연결을 기다리면서 되돌아 가야합니다. 'recv'가'0 '을 반환하는 동작은 잘 설명되어 있습니다. 그리고 좋은 네트워킹 튜토리얼은 그 의미와 행동을 당신에게 말해 줬어야합니다. –