如何获取Client和Server自己的还有对方的IPport

    xiaoxiao2021-03-30  59

    今天同了个问题, 说如何得到Client自己的source IP和Port。 

    之前都是server端去读取client的IP和Port。搞了个小程序试试,果然是可以拿到的。话不多说上code。

    Note:build option

    g++ $filename -std=c++11 -lpthread

    #include <stdio.h> #include <string.h> // for memset(), bzero... #include <sys/socket.h> // for socket(), bind(), and connect()... #include <arpa/inet.h> // for sockaddr_in and inet_ntoa()... #include <thread> #include <unistd.h> #define MAXPENDING 10 int client(void) { int sock; // Socket descriptor. struct sockaddr_in serverAddress; const char* serverIP = "127.0.0.1"; unsigned short serverPort = 1234; // Create a reliable, stream socket using TCP. sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // Set server address info. memset(&serverAddress, 0, sizeof(serverAddress)); // Init. serverAddress.sin_family = AF_INET; // Internet address family. serverAddress.sin_addr.s_addr = inet_addr(serverIP); // IP. serverAddress.sin_port = htons(serverPort); // Port. // Connect to server. connect(sock, (struct sockaddr*) &serverAddress, sizeof(serverAddress)); // Get client IP:Port and Server IP:Port. struct sockaddr_in c, s; socklen_t cLen = sizeof(c); socklen_t sLen = sizeof(s); getsockname(sock, (struct sockaddr*) &c, &cLen); getpeername(sock, (struct sockaddr*) &s, &sLen); printf("Client:::>Client: %s:%d\nServer: %s:%d\n", inet_ntoa(c.sin_addr), ntohs(c.sin_port), inet_ntoa(s.sin_addr), ntohs(s.sin_port)); // Send data to server. char buffer[100]; int i = 0; for (i = 0; i < 99; i++) { buffer[i] = 'a'; } buffer[99] = '\0'; send(sock, buffer, sizeof(buffer), 0); // Close. close(sock); return 0; } int server() { int listenSock, connectSock; struct sockaddr_in serverAddress; unsigned short serverPort = 1234; // Create socket to listen incoming connections. listenSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // Set local address info. memset(&serverAddress, 0, sizeof(serverAddress)); // Init. serverAddress.sin_family = AF_INET; // Internet address family. serverAddress.sin_addr.s_addr = htonl(INADDR_ANY); // Any available interface. 0.0.0.0 serverAddress.sin_port = htons(serverPort); // Port. // Bind to the local address. bind(listenSock, (struct sockaddr*) &serverAddress, sizeof(serverAddress)); // Listen. listen(listenSock, MAXPENDING); struct sockaddr_in clientAddress; socklen_t clientLen = sizeof(clientAddress); char buffer[1000]; bzero(buffer, sizeof(buffer)); // Accept. printf("Waiting connection...\n"); connectSock = accept(listenSock, (struct sockaddr*) &clientAddress, &clientLen); // Get client IP:Port and Server IP:Port. struct sockaddr_in c, s; socklen_t cLen = sizeof(c); socklen_t sLen = sizeof(s); getsockname(connectSock, (struct sockaddr*) &s, &sLen); // ! use connectSock here. getpeername(connectSock, (struct sockaddr*) &c, &cLen); // ! use connectSock here. printf("Server:::>Client: %s:%d\nServer: %s:%d\n", inet_ntoa(c.sin_addr), ntohs(c.sin_port), inet_ntoa(s.sin_addr), ntohs(s.sin_port)); // Receive message. recv(connectSock, buffer, sizeof(buffer), 0); printf("Receive Message: %s\n", buffer); return 0; } int main(int argc, char** argv) { std::thread Server_thread(server); sleep(2); std::thread Client_thread(client); sleep(10); Server_thread.join(); Client_thread.join(); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-665171.html

    最新回复(0)