linux socket通讯如何获取本地的源端口号

关于TCP IP网络通讯的资料非常多,TCP IP通过IP数据包模式进行端对端通讯。典型的TCP数据包如下

可以看到数据包包含了源端口号和目的端口号,客户端socket向服务端发起连接时,系统会给socket随机分配一个源端口号,我们可以通过getsocketname来获取连接成功的socket的原端口信息。
函数原型
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
sockfd socket连接的句柄
addr 网络地址指针,
Linux C编程中,要获取正在使用的端口号,我们可以使用socket编程中的getsockname函数。该函数的功能是获取一个套接字的本地协议地址(也就是本机的IP地址和端口号)。该函数的型为: ```c int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); ``` 其中,sockfd是之前创建的套接字的文件描述符,addr指向一个sockaddr类型的结构体,存放获取的地址信息,addrlen指向一个int型变量的指针,表示参数addr的长度。 具体的使用方法如下: ```c #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字 if (sockfd < 0) { printf("Create socket failed!\n"); return -1; } struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); memset(&addr, 0, sizeof(addr)); // 调用getsockname函数获取本地协议地址 if (getsockname(sockfd, (struct sockaddr *)&addr, &addrlen) < 0) { printf("Get address info failed!\n"); return -1; } printf("Local address : %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); close(sockfd); return 0; } ``` 在上面的代码中,我们首先创建了一个TCP/IP协议的套接字,然后使用getsockname函数获取了本地协议地址,并输出了IP地址和端口号。需要注意的是,因为getsockname返回的是一个sockaddr类型的结构体,而我们使用的是TCP/IP协议,因此需要将其转换为sockaddr_in类型的结构体,这可以使用强制类型转换来实现。另外,为了将本地协议地址输出成字符串形式,我们使用了inet_ntoa函数来将一个32位无符号整数转换为点分十进制字符串。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值