2013-04-10 34 views
1
#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,但是我的程序輸出它沒有被使用。請大家幫我嘗試了這一點如何使用套接字檢查打開的端口

回答

3

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.0,而不是127.0.0.1,否則你只能找出你可以綁定到17.0.0.1的端口,這不是你想要發現的。但是,爲什麼你想在netstat已經存在的時候這樣做是一個謎。

+0

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