2013-05-03 2 views
1

У меня есть функция createServerSocket(). К этой функции можно обращаться несколькими потоками для создания своих сокетов.Передача указателя на SOCKADDR_IN и SOCKET в функции

Я хочу, чтобы каждый поток, чтобы передать три аргумента, socketIdentifier * sockaddr_in * и конкретный номер порта к createrServerSocket() функции, так что каждый поток имеет уникальный сокет.

Для этого я передаю функцию socketIdentifier * sockaddr_in * и специфический номер порта к createrServerSocket() в качестве указателей, так что socketIdentifier и розетка должна быть создана внутренняя резьба, доступную.

Ниже мой фрагмент кода:

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

Line: 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

У вас есть переменная named 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; 
} 
Смежные вопросы