如何获取Client和Server自己的还有对方的IP/port

来源:互联网 发布:win10 卸载软件 编辑:程序博客网 时间:2024/06/07 19:05

今天同了个问题, 说如何得到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;}


0 0
原创粉丝点击