c++ - getpeername sa_data

标签 c++ sockets

我想获取连接到我的服务器套接字的套接字的 IP 地址。我已经包含了我的代码。

sa_data 不返回类型为“xxx.xxx.xxx.xxx”的 char[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();
}

最佳答案

accept(2) 的第二个和第三个参数让您无需额外调用 getpeername(2) 即可获得该信息.然后你需要将 binary address 转换为 string representationinet_ntoa(3) .

关于c++ - getpeername sa_data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3402457/

相关文章:

c++ - C/C++ 库函数和运算符是最优的吗?

sockets - 在我有兴趣接受之前,我可以将套接字留在 SYN_RECV 中吗?

java - 套接字:使用 Java 发现端口可用性

python - 如何在Python中通过套接字建立连接?

c++ - 为什么显式构造被视为(隐式)缩小转换?

c++ - 使用 std::copy 从随机数分布中复制

c++ - 在 main 中使用函数的局部变量

c++ - 了解工厂方法和静态变量分配的返回值优化 (Visual Studio)

c - 在机器上查找可用的网络端口

android - unity android wifi socket通信通过Android DLL