本文是通过tcp连接,连到服务端,然后拿到套接字获取当前连接的ip端口
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char* message);
int main(int argc, char* argv[]) {
int sock;
struct sockaddr_in serv_addr, client_addr;
if(argc != 3) {
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock == -1)
error_handling("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
// 与服务端建立tcp连接
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
error_handling("connet() error");
// 自身ip存储位置
char client_addr_ip[20];
// 获取自身IP
socklen_t client_addr_len = sizeof(client_addr);
getsockname(sock, (struct sockaddr*)&client_addr, &client_addr_len);
// 把ip转换为点分十进制
inet_ntop(AF_INET, &client_addr.sin_addr, client_addr_ip, sizeof(client_addr_ip));
printf("本机ip和端口 %s:%d\n", client_addr_ip, ntohs(client_addr.sin_port));
close(sock);
return 0;
}
void error_handling(char* message) {
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
使用方法
#编译
gcc -o a.out a.c
#运行
a.out 127.0.0.1 22