#include<stdio.h>
#include<stdlib.h>// for exit
#include<string.h>
#include<unistd.h> //for close(),read()
#include<sys/types.h>//
#include<sys/socket.h> //for socket api's
#include<netinet/in.h>//for struct sockaddr_in
#include<arpa/inet.h>// for inet_pton
#define MAX 30
int ssfd; //listenfd
int res; //connfd
int serverlen;
struct sockaddr_in serveraddr;
void main()
{
int i=0,res;
int startPortRange=0;
int stopPortRange=65536;
for(i=startPortRange; i<stopPortRange; i++)
{
ssfd=socket(AF_INET,SOCK_STREAM,0);
if(ssfd==-1)
{
printf("\nSocket Creation Failed....");
}
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1"); // inet_addr converts an IPV4 from dotted decimal string
//to e.g(127.0.0.1) to its 32-bit network byte ordered binary value.
serveraddr.sin_port=i;
serverlen=sizeof(serveraddr);
res = bind(ssfd,(struct sockaddr*)&serveraddr,serverlen);
if(res==-1)
{
printf("\nPort in Use : %d",i);
}
else
{
printf("\nPort not in use: %d",i);
}
close(ssfd);
}
}
我正在尝试在计算机上读取开放端口(某些程序使用的)。该程序运行正常。但它没有给出正确的结果。例如,端口3306由我的计算机上的mysql使用,但我的程序输出它没有被使用。请帮我试一试
答案 0 :(得分:3)
而不是
serveraddr.sin_port=i;
你需要使用
serveraddr.sin_port=htons(i);
因为inetaddr结构中的端口地址必须具有网络字节顺序
答案 1 :(得分:0)
你应该绑定到0.0.0.0而不是127.0.0.1,否则你只能找到你可以绑定到17.0.0.1的端口,这不是你想要找到的。但是,当netstat已经存在时,为什么要这样做是一个谜。