C语言通过套接字获取端口号
时间: 2024-04-15 19:30:08 浏览: 199
在 C 语言中,可以使用 `getsockname()` 函数从套接字中获取端口号。`getsockname()` 函数的原型如下:
```c
#include <sys/types.h>
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```
下面是一个示例代码,演示如何通过套接字获取端口号:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
exit(1);
}
// 绑定地址和端口号
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(8000); // 设置端口号
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
perror("bind");
exit(1);
}
// 获取端口号
struct sockaddr_in local_addr;
socklen_t addrlen = sizeof(local_addr);
getsockname(sockfd, (struct sockaddr *)&local_addr, &addrlen);
int port = ntohs(local_addr.sin_port);
printf("端口号: %d\n", port);
// 关闭套接字
close(sockfd);
return 0;
}
```
在上述示例中,我们首先创建了一个套接字 `sockfd`,然后将其绑定到本地地址和端口号 `8000` 上。接下来,我们使用 `getsockname()` 函数获取套接字的本地地址和端口号,并将其存储在 `local_addr` 结构体中。最后,我们通过 `ntohs()` 函数将端口号从网络字节序转换为主机字节序,并将其打印出来。
请注意,上述代码只是一个示例,需要你根据实际情况进行适当的修改和错误处理。
阅读全文