在C++ Winsock API中,要在接受连接之前获取连接客户端的IP地址,可以使用以下步骤:
#include <winsock2.h>
#include <ws2tcpip.h>
#include<iostream>
int main() {
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
std::cerr << "WSAStartup failed: " << iResult<< std::endl;
return 1;
}
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocket == INVALID_SOCKET) {
std::cerr << "socket failed: " << WSAGetLastError()<< std::endl;
WSACleanup();
return 1;
}
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = INADDR_ANY;
service.sin_port = htons(8080);
if (bind(listenSocket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) {
std::cerr << "bind failed: " << WSAGetLastError()<< std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
if (listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) {
std::cerr << "listen failed: " << WSAGetLastError()<< std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
}
accept()
函数接受客户端连接,并获取客户端的IP地址。 sockaddr_in client;
int clientLength = sizeof(client);
SOCKET clientSocket = accept(listenSocket, (SOCKADDR*)&client, &clientLength);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "accept failed: " << WSAGetLastError()<< std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
char ipAddress[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &client.sin_addr, ipAddress, INET_ADDRSTRLEN);
std::cout << "Client connected from IP address: " << ipAddress<< std::endl;
在上面的代码中,accept()
函数会阻塞,直到有新的客户端连接。当有新的客户端连接时,accept()
函数会返回一个新的socket,用于与客户端通信。同时,accept()
函数还会填充客户端的IP地址和端口号。
在这个例子中,我们使用inet_ntop()
函数将客户端的IP地址从二进制格式转换为字符串格式,并输出到控制台。
注意:在完成通信后,需要关闭socket并调用WSACleanup()
函数来清理Winsock库。
领取专属 10元无门槛券
手把手带您无忧上云