2013-05-03 2 views
1

함수가 있습니다. createServerSocket()입니다. 이 함수는 소켓을 만들기 위해 여러 스레드에서 액세스 할 수 있습니다.함수의 SOCKADDR_IN 및 SOCKET에 대한 포인터 전달

나는 *를 sockaddr_in * 특정 포트 번호createrServerSocket() 기능에 각 스레드는 고유 소켓을 가질 수 있도록, 각 스레드는 세 개의 인수하는 socketIdentifier를 전달하려는. 이를 위해

, 내가 포인터로 socketIdentifier, *를 sockaddr_in * 특정 포트 번호 createrServerSocket() 함수를 통과하고 socketIdentifier 있도록하고 accessable 한 내부 스레드 수 있어야 생성 된 소켓. 여기
VOID createServerSocket(SOCKADDR_IN *socket, SOCKET *socketIdentifier, int PORT) 
{ 

    //Socket Binding// 
    WSADATA wsa; 

    //Initialise winsock// 
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) 
     { 
     exit(EXIT_FAILURE); 
     } 

    //Create a socket// 
    if((*socketIdentifier = socket(AF_INET , SOCK_DGRAM , 0)) == INVALID_SOCKET) 
     {     
     MessageBox(NULL, 
        "Socket not Created", 
        "Failure :(", 
        MB_ICONINFORMATION); 
     exit(EXIT_FAILURE); 
     } 
    //Socket Created// 

    //Prepare the sockaddr_in structure// 
    *socket.sin_family = AF_INET; 
    *socket.sin_addr.s_addr = INADDR_ANY; 
    *socket.sin_port = htons(PORT); 

    //Bind// 
    if(bind(socketIdentifier ,(struct sockaddr *)&socket , sizeof(socket)) == SOCKET_ERROR) 
     {    
     MessageBox(NULL, 
        "Bind Failed", 
        "Failure :(", 
        MB_ICONINFORMATION); 
     exit(EXIT_FAILURE); 
     } 
    //Else Bind Done// 
    MessageBox(NULL, 
       "Bind Done", 
       "SUCCESS :)", 
       MB_ICONINFORMATION); 

} 

가 호출하는 함수입니다 : 아래

내 코드입니다

DWORD WINAPI threadProc(LPVOID param) 
{ 
    SOCKADDR_IN socket; 
    SOCKET socketIdentifier; 
    createServerSocket(*socket,*socketIdentifier,8888); //Create a socket with a socketIdentifier and bind()ed to PORT#8888. 
     //Do something at this socket 
     Return TRUE; 
} 

이 내가 얻을 오류는 다음과 같습니다

error C2064: term does not evaluate to a function taking 3 arguments
error C2228: left of '.sin_family' must have class/struct/union error C2228: left of '.sin_addr' must have class/struct/union
error C2228: left of '.S_un' must have class/struct/union
error C2228: left of '.S_addr' must have class/struct/union error C2228: left of '.sin_port' must have class/struct/union
error C2070: ''unknown-type'': illegal sizeof operand

라인 : if ((* socketIdentifier = socket (AF_INET, SO CK_DGRAM, 0)) == INVALID_SOCKET)

오류 : 오류 C2064 : 용어는 3 개 인수을 복용 함수에 평가하지 않습니다

답변

1

귀하의 bind 호출이 완전히 잘못된 것입니다, 그것은 뭔가를해야한다 :

bind(*socketIdentifier, (SOCKADDR*) socket, sizeof(*socket)) 

은 또한 컴파일러 오류에 이르게 socket 구조 포인터의 초기화에 우선 순위 문제가 있습니다. (*socket).sin_family 등 또는 socket->sin_family 등을 사용하십시오. 마지막 것은 구조 포인터의 일반적인 사용법입니다.

+0

정말 고마워요. 문제의 모든 나머지는 라인을 제외 해결된다 : 만약 ((* socketIdentifier = 소켓 (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) 오류 : 오류 C2064가 : 기간이 3 개 인수를 – Ayse

+1

복용 함수에 평가하지 않습니다 @ AyeshaHassan 이미'socket'이라는 지역 변수 (인자)를 가지고 있기 때문입니다. 변수 이름을 바꾸면 함수를 호출 할 수 있습니다. –

+0

정말 고마워요. 문제 해결됨 :) – Ayse

1

createServerSocket 함수에서 문제 및 컴파일러 오류를 일으키는 socket이라는 변수가 있습니다. 다음과 같이 시도하십시오.

VOID createServerSocket(SOCKADDR_IN& sock, SOCKET& socketIdentifier, int PORT) 
{ 

    //Socket Binding// 
    WSADATA wsa; 

    //Initialise winsock// 
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) 
     { 
     exit(EXIT_FAILURE); 
     } 

    //Create a socket// 
    if((socketIdentifier = socket(AF_INET , SOCK_DGRAM , 0)) == INVALID_SOCKET) 
     {     
     MessageBox(NULL, 
        "Socket not Created", 
        "Failure :(", 
        MB_ICONINFORMATION); 
     exit(EXIT_FAILURE); 
     } 
    //Socket Created// 

    //Prepare the sockaddr_in structure// 
    sock.sin_family = AF_INET; 
    sock.sin_addr.s_addr = INADDR_ANY; 
    sock.sin_port = htons(PORT); 

} 

DWORD WINAPI threadProc(LPVOID param) 
{ 
    SOCKADDR_IN sock; 
    SOCKET socketIdentifier; 
    createServerSocket(sock,socketIdentifier,8888); //Create a socket with a socketIdentifier and bind()ed to PORT#8888. 
     //Do something at this socket 
     return TRUE; 
} 
관련 문제