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