相关疑难解决方法(0)

如何让内核在TCP套接字编程中选择范围(1024,5000)中的端口号

当我运行以下代码时:

struct   sockaddr_in sin;
int addrlen;   
addrlen=sizeof(sin);   
memset(&sin, 0, sizeof(sin));  
sin.sin_family = AF_INET;  
sin.sin_addr.s_addr=inet_addr("123.456.789.112");  
sin.sin_port=htons(0); // so that the kernel reserves a unique port for us  
sd_server = socket(PF_INET, SOCK_STREAM, 0);  
bind(sd_server, (struct sockaddr *) &sin, sizeof(sin));  
getsockname(sd_server,(struct sockaddr*)&sin,&addrlen);  
port=ntohs(sin.sin_port); 
printf("port number = %d\n",port);
Run Code Online (Sandbox Code Playgroud)

根据套接字,我必须得到1024到5000之间的端口号,但是我的端口号大约是30,000.
我该怎么办?

sockets kernel tcplistener tcpclient

15
推荐指数
2
解决办法
3万
查看次数

UDP套接字的源和目标端口?

我正在通过编写一个将DNS查询发送到指定服务器的小应用程序来学习C. 以下是网络代码的示例:

int send_query()
{
    int sockfd;
    struct sockaddr_in server;

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
            perror("cannot create socket\n");
    }

    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(53);
    inet_pton(AF_INET, "8.8.8.8", &(server.sin_addr));

    sendto(sockfd, const void *buffer, size_t length, 0, (struct sockaddr *) &server, sizeof(server));
}
Run Code Online (Sandbox Code Playgroud)

这可以正常工作,因为查询已成功发送,并收到回复.但是,通过使用Wireshark嗅探流量,我可以看到以下消息:Destination unreachable (Port unreachable).

我发现我可以通过调用避免此bind()之前sendto():

int send_query()
{
    int sockfd;
    struct sockaddr_in server;

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
            perror("cannot create socket\n");
    } …
Run Code Online (Sandbox Code Playgroud)

c sockets linux networking udp

6
推荐指数
1
解决办法
2963
查看次数

如何使用c检查linux中的端口是否空闲

我从来没有写过这样的东西,如何在Linux环境中使用c程序检查端口是否为空,非常感谢.

ps寻找方法,不使用bind或connect并检查它是否失败.

编辑我不能使用绑定或连接,寻找更快的方法来找到连续免费的3k端口

c linux

5
推荐指数
1
解决办法
2825
查看次数

标签 统计

c ×2

linux ×2

sockets ×2

kernel ×1

networking ×1

tcpclient ×1

tcplistener ×1

udp ×1