2014-04-22 2 views
1

나는 C++ 네트워크 응용 프로그램을 만들고 서버를 만들지 만 이상한 문제가 있습니다. 내가 청취 할 때 연결을 기다려야하지만 응용 프로그램은 수신 대기 호출이없는 경우 계속됩니다. 't은 exist.This 내 코드입니다 : 나는 또한 문제가 있었다 있는지 비활성화 방화벽이 main.I에서 serverStart 호출 오전C++ winsock 이상한 오류

#include "includes.hpp" 
using namespace std; 
SOCKET sv; 
WSADATA w; 

int serverStart(int port) 
{ 
    int error = WSAStartup(0x0202,&w); 
    if(error) 
    { 
     fprintf(stderr,"Error de startup:%i",error); 
     return false; 
    } 
    if(w.wVersion != 0x0202) 
    { 
     fprintf(stderr,"Error versión incorrecta de wsadata: Esperada 202.Obtenida %X",w.wVersion); 
     WSACleanup(); 
     return false; 
    } 
    SOCKADDR_IN addr; 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(port); 
    addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    sv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if(sv == INVALID_SOCKET) 
    { 
     fprintf(stderr,"Error de socket"); 
     return false; 
    } 
    if(bind(sv,(LPSOCKADDR)&addr,sizeof(addr)) == SOCKET_ERROR){ 
     fprintf(stderr,"Error de bind"); 
     return false; 
    } 
    fprintf(stdout,"Listen.."); 
    listen(sv,SOMAXCONN); 
    fprintf(stdout,"Fin"); 
} 

하지만 일을하지 않았다.

감사

+0

아마도 '듣기'에 대한 호출이 실패했을 수 있습니다. 이 함수는 호출이 성공했는지 또는 실패했는지를 알기 위해 사용할 수있는'int'를 반환합니다. 그 반환 코드를 잡고 그것이 무엇인지 확인하십시오. 오류 코드와 그 의미를 [청취 할 문서 페이지] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms739168(v=vs.85).aspx)에서 확인할 수 있습니다. – Ove

+0

듣기가 0 – Cako

답변

1

listen를 호출하면 연결 만 incomming 받아들이는 상태에 소켓을 배치합니다. 실제로 연결을 수락하려면 accept 함수를 호출해야합니다. accept을 호출하면 연결될 때까지 프로그램이 차단됩니다.

SOCKET ClientSocket = INVALID_SOCKET; 
// Accept a client socket 
ClientSocket = accept(sv, NULL, NULL); 
if (ClientSocket == INVALID_SOCKET) { 
    printf("accept failed: %d\n", WSAGetLastError()); 
    closesocket(sv); 
    WSACleanup(); 
    return 1; 
} 
+0

을 반환합니다. 동의하지 않는다고 말하는 것은 아닙니다. 연결을 수신 대기하지 않는다고 말하고 있습니다. – Cako

+0

'accept'에 대한 호출을 포함하면 연결을 수신합니다. 연결이되면이를 수락합니다. 나는 당신의 코드를'accept'에 대한 호출로 테스트했고, 실제로 연결을 기다리는 것을 볼 수 있습니다. http://imgur.com/lXzABt1 – Ove

+0

감사합니다. – Cako

0

listen()은 차단 기능이 아닙니다. 소켓을 청취 상태로 만듭니다. accept()는 차단 함수이고 recv() 및 send()입니다.