代码之家  ›  专栏  ›  技术社区  ›  Steven Shih

getpeername sau数据

  •  1
  • Steven Shih  · 技术社区  · 14 年前

    sau数据不返回类型为“xxx.xxx.xxx.xxx”的字符[14]。相反,它又回来了 [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 回复  |  直到 14 年前
        1
  •  2
  •   Nikolai Fetissov    14 年前

    第二和第三个论点 accept(2) 允许您无需额外致电 getpeername(2) 二进制地址 字符串表示法 比如说 inet_ntoa(3) .

        2
  •  1
  •   Alex Martelli    14 年前

    WSADATA 应该是一个 char [14] struct 如图所示 these docs .

    顺便说一句,在您检查的各种错误情况下,您应该终止整个函数(例如,使用 return ),而您所做的似乎只是在一些消息之后继续使用结构&c已知无效。。。

    编辑 sa_data 你是说 test.sa_data ,另一个答案解释了为什么它不是你所期望的。不管怎样,请留下这个答案,因为至少第二段非常重要(而且仍然相关;-)。

        3
  •  0
  •   user207421    14 年前

    sau数据不返回

    它没有被指定这样做,所以难怪它没有。

    你需要查看sockaddr\u in和sockaddr\u in 6。