2013-05-03 85 views
1

我有一個函數createServerSocket()。這個函數可以被多個線程訪問來創建它們的套接字。在函數中傳遞指向SOCKADDR_IN和SOCKET的指針

我想每個線程傳遞三個參數,一個socketIdentifier,* SOCKADDR_IN *和具體端口號createrServerSocket()功能,使每個線程都有一個唯一的插座。

對於這一點,我傳遞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

線: 如果((* 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

非常感謝。問題的所有其餘的都解決了,除了 行:if((* socketIdentifier =插座(AF_INET,SOCK_DGRAM,0))== INVALID_SOCKET) 錯誤:錯誤C2064:術語不計算爲服用3個參數 – Ayse 2013-05-03 05:55:04

+1

功能@ AyeshaHassan這是因爲你已經有了一個名爲'socket'的局部變量(參數)。重命名該變量並且可以調用該函數。 – 2013-05-03 05:56:20

+0

非常感謝。問題解決了 :) – Ayse 2013-05-03 05:59:56

1

您有一個名爲socket的變量,它在您的函數createServerSocket中導致問題和編譯器錯誤。請嘗試這樣的:

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; 
}