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

今天同了个问题, 说如何得到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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值