getpeername sa_data - PullRequest
       3

getpeername sa_data

1 голос
/ 04 августа 2010

Я хочу получить IP-адрес сокета, который подключен к моему сокету сервера.Я включил свой код.

sa_data не возвращает char [14] типа "xxx.xxx.xxx.xxx".Вместо этого он возвращает [11][1][xxx][xxx][xxx][xxx][][][][][][][]...[].Кто-нибудь может помочь?

int InitialResult;
char SendMessage[1024];
char ReceiveMessage[1024];
WSADATA WSAData;
addrinfo Hints;
addrinfo *Result;
SOCKET ListenSocket;
SOCKET ClientSocket;

ZeroMemory(&Hints, sizeof(Hints));
Hints.ai_family = AF_INET;
Hints.ai_socktype = SOCK_STREAM;
Hints.ai_protocol = IPPROTO_TCP;
Hints.ai_flags = AI_PASSIVE;
while(1)
{
    InitialResult = WSAStartup(MAKEWORD(2,2), &WSAData);
    if (InitialResult != 0)
    {
        cout << "WSA start up failed.";
    }
    InitialResult = getaddrinfo(NULL, portnumber, &Hints, &Result);
    if (InitialResult != 0)
    {
        cout << "Get address information failed.";
        WSACleanup();
    }
    ListenSocket = socket(Result->ai_family, Result->ai_socktype, Result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET)
    {
        cout << "Socket initialization failed.";
        WSACleanup();
    }
    InitialResult = bind(ListenSocket, Result->ai_addr, (int)Result->ai_addrlen);
    if (InitialResult == SOCKET_ERROR)
    {
        cout << "Bind failed." << portnumber;
        closesocket(ListenSocket);
        ListenSocket = INVALID_SOCKET;
        WSACleanup();
    }
    InitialResult = listen(ListenSocket, SOMAXCONN);
    if (InitialResult == SOCKET_ERROR)
    {
        cout << "Listen failed." << portnumber;
        closesocket(ListenSocket);
        ListenSocket = INVALID_SOCKET;
        WSACleanup();
    }
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET)
    {
        cout << "Socket accept failed." << portnumber;
        WSACleanup();
    }

    sockaddr test;
    int a = sizeof(test);
    cout << "getpeername() return value : " << getpeername(ClientSocket, &test, &a) << endl;
    cout << "test.sa_data : " << test.sa_data;


    StartReceive(ReceiveMessage, ClientSocket);
    strcpy(SendMessage,"Congratulations!! You have successfully transfered some data to G DA.");
    StartSend(SendMessage, ClientSocket);
    StartSend(portnumber, ClientSocket);
    InitialResult = shutdown(ClientSocket, SD_SEND);
    if (InitialResult == SOCKET_ERROR)
    {
        cout << "Shut down failed." << portnumber;
        closesocket(ClientSocket);
        WSACleanup();
    }
    closesocket(ClientSocket);
    closesocket(ListenSocket);
    WSACleanup();
}

Ответы [ 3 ]

2 голосов
/ 04 августа 2010

Второй и третий аргументы accept(2) позволяют получить эту информацию без дополнительного вызова getpeername(2).Затем вам нужно преобразовать двоичный адрес в строковое представление в нечто вроде inet_ntoa(3).

1 голос
/ 04 августа 2010

Почему, по вашему мнению, WSADATA должно быть char [14]? Это struct, как показано, например. в эти документы .

И кстати, в различных случаях ошибок, которые вы проверяете, вы должны завершить всю функцию (например, с помощью return), в то время как то, что вы делаете, похоже, просто продолжается, после некоторого сообщения, со структурами быть недействительным ...

Редактировать : о, понятно, когда вы говорите sa_data, вы имеете в виду test.sa_data, и другой ответ объясняет, почему это не то, что вы ожидаете. Оставить этот ответ в любом случае, так как, по крайней мере, второй абзац довольно важен (и все еще актуален; -).

0 голосов
/ 04 августа 2010

sa_data не возвращает char [14] из тип "xxx.xxx.xxx.xxx"

Это не указано для этого, поэтому неудивительно, что это не так.

Вам нужно изучить sockaddr_in и sockaddr_in6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...