2012-05-21 2 views
0

두 개의 소켓이 두 개의 별개 포트에 묶여있는 프로그램을 작성했습니다. 별도의 파일에있는 다른 프로그램의 객체를 만들었습니다. 소켓은 초기화되고 별도의 포트로 묶여 있습니다. 런타임 예외가 발생하고 WSAGetLastError를 인쇄하려고하면 10093 오류 코드가 반환됩니다.동일한 프로그램에서 여러 소켓을 만드는 방법.?

내가 알고 싶은 것은 어떻게 WSAStartup()과 WSACleanup()을 사용할 수 있는가입니다. 각 소켓에 대해 WSAStartup()을 호출하고 WSACleanup()을 세 번 호출해야합니까?

누군가가이 문제를 극복하도록 도와 줄 수 있습니까? 미리 감사드립니다. :-)

+3

질문에 코드가있는 경우 도움이 될 것입니다. –

답변

3

WSAStartup()/WSACleanup()은 프로그램별로, 즉 프로그램 당 한 번씩 전화해야합니다.

+0

감사합니다. WSAStartup()과 WSACleanup()을 제안했습니다. 하지만이 시점에서 같은 오류가 발생합니다 'IP = inet_ntoa (* (struct in_addr *) * hostEntry-> h_addr_list); ' 디버깅을 시도하면 hostEntry는 null을 반환합니다. 여기, 'hostEntry = gethostbyname (hostId);' – rutharanga

+1

어, 그는 C 언어로 말하고있다 ... – Ashe

+0

@rutharanga'gethostbyname'이'NULL'을 반환하면 즉시'WSAGetLastError'를 체크해야한다. –

0

WSAStartup을 한 번 (주소 공간 \ 프로세스에서), winsock dll을 사용할 때 WSACleanup을 호출하면됩니다. 소켓 사용을 마쳤 으면 WSACleanup 만 호출하면됩니다.

내가 일반적으로 같은 것을 수행하여 스타트 업의 \ 정리를 구현

:

class HigherLevelSocketWrapper 
{ 
private: 
    static int m_iInstanceCount = 0; 

public: 
    HigherLevelSocketWrapper() 
    { 
     //Check if m_iInstanceCount is 0, if so, call WSAStartup. 
     //increment m_iInstanceCount 
    } 
    virtual ~HigherLevelSocketWrapper() 
    { 
     //decrement m_iInstanceCount 
     //Check if m_iInstanceCount is 0, if so, call WSACleanup. 
    } 
}; 
(이 정말 단일 스레드 애플리케이션을위한 유일한 안전하지만, 멀티 스레드에 대한 뮤텍스를 사용은 ... 없습니다 어렵다)