如何使用套接字检查打开的端口

问题描述:

#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); 
    } 
} 

我试图读取计算机上打开的端口(由某些程序使用)。该程序工作正常。但是它并没有给出正确的结果。例如,我的计算机上的mysql使用的端口是3306,但是我的程序输出它没有被使用。请大家帮我尝试了这一点如何使用套接字检查打开的端口

serveraddr.sin_port=i; 

你需要使用

serveraddr.sin_port=htons(i); 

,而不是因为InetAddr代表结构中的端口地址必须具有网络字节顺序

+0

我已添加此行serveraddr.sin_port = htons(i);但它给了我以前的输出 – Swapnil 2013-04-10 12:18:34

你应该绑定到0.0.0.0,而不是127.0.0.1,否则你只能找出你可以绑定到17.0.0.1的端口,这不是你想要发现的。但是,为什么你想在netstat已经存在的时候这样做是一个谜。

+0

这是我的家庭作业 – Swapnil 2013-04-10 13:26:41