我想获取连接到我的服务器套接字的套接字的IP地址。我已经包含了我的代码。
sa_data不返回“xxx.xxx”类型的char14。相反,它返回[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();
}发布于 2010-08-04 12:04:33
accept(2)的第二个和第三个参数允许您在不额外调用getpeername(2)的情况下获取该信息。然后,您需要将二进制地址转换为字符串表示,并使用类似inet_ntoa(3)的内容。
发布于 2010-08-04 12:04:12
你为什么认为WSADATA应该是一个char [14]?如在these docs中所示,它是一个struct。
顺便说一句,在你检查的各种错误情况下,你应该终止整个函数(例如,使用return),而你所做的似乎只是继续,在一些消息之后,结构和c是无效的……
编辑:哦,我明白了,当你说sa_data时,你指的是test.sa_data,另一个答案解释了为什么它不是你所期望的。保留这个答案,因为至少第二段是非常重要的(并且仍然相关;-)。
发布于 2010-08-04 12:09:54
sa_data不返回“xxx.xxx”类型的char14
它没有指定这样做,所以难怪它不这样做。
你需要调查一下sockaddr_in和sockaddr_in6。
https://stackoverflow.com/questions/3402457
复制相似问题