如何确定TCP端口是否打开?[关闭]


9

我试图在C中实现套接字编程。当我尝试从客户端连接到服务器(Ubuntu)时,它显示诸如“连接失败”之类的错误。

所以我认为问题出在港口。我正在使用5454 / tcp端口进行套接字编程。

我怎么知道5454端口是否在监听?如果不是,那么我可以在Ubuntu中使用C进行TCP套接字编程的端口是哪些?这仅仅是端口问题,还是我的代码有问题或在LINUX Ubuntu中需要任何设置吗?

编辑: 代码段:

  int socket_send;
   struct sockaddr_in address;
printf("\n Initialization Socket....");

socket_send = socket(AF_INET,SOCK_STREAM,0);
if(socket_send == -1)
{
    perror("\n Socket not created.Error:");
    return 1;
}
printf("\n Socket created");

address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(5454);

if(connect(socket_send,(struct sockaddr*)&address,sizeof(struct sockaddr))<0)
{
    perror("\nConnetion failed.Error:");
    return 1;
}
printf("\n Connected");

if(send(socket_send,(char*)buffer,size,flag)<0)
{
    perror("\nSending failed.Error:");
    return 1;
}
printf("\n Data successfully sent");
 close(socket_send);

编辑:问题在端口,所以我只是重新安装了Ubuntu,它正在工作。谢谢大家


首先,端口5454应该侦听状态,然后连接。第二,检查防火墙。
PersianGulf

我总是尝试lsof -i:5454(您可能需要以与打开端口的程序相同的用户身份或以root用户身份执行它)。
卡洛斯·坎德罗斯

服务器代码在哪里(或该服务器是现有程序),请注意,如果要运行虚拟服务器,nc(netcat)是您的朋友。
Foon 2013年

Answers:


10

由于您正在使用CI进行编程,因此想到发布一个小片段来显示端口是否打开,因此我已编程输出一个字符串。您可以轻松地更改它以满足您的需求。

正如您在这里所说的那样,回答第二个问题,如果您是系统上的超级用户(root),并且该端口未被其他任何应用程序使用,那么您几乎可以使用任何端口。如果您不是root用户,则可以打开1024以上的任何端口。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 


int main(int argc, char *argv[])
{
    int portno     = 5454;
    char *hostname = "192.168.56.101";

    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        error("ERROR opening socket");
    }

    server = gethostbyname(hostname);

    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);

    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
        printf("Port is closed");
    } else {
        printf("Port is active");
    }

    close(sockfd);
    return 0;
}

优秀的!C检查端口状态的方法。
Valentin Bajrami

我喜欢提到“小片段” ^^。但是+1是一个非常有用的摘要。
Olivier Dulac 2013年

请注意,在这种情况下,代码与其他线程同时运行这可能fork()的新工艺,则需要确保套接字文件描述符是通过指定正确关闭SOCK_CLOEXECsocket()通话。
Ton van den Heuvel

5

有几种方法,最常见的可能是:

# netstat -ltun

您当然可以grep使用其他(正则)表达式。

如果您使用其他计算机(客户端和服务器),则也需要检查iptables

您几乎可以使用程序当前未使用的任何端口。但是,请检查/etc/services已知端口和保留端口。


您可以使用“ netstat -ltun”直接列出处于侦听状态的tcp / udp端口
dsmsk80 2013年

当我使用netstat -an | grep LISTEN它仅显示两个tcp prot,其余为UDP端口。现在,如果我要激活5454端口,那么如何激活?
dxr

@ dsmsk80啊,确实,我想坏习惯很难死。已更正。
dawud

1

检查链接(http://wi-fizzle.com/article/458)是否打开了TCP端口

nc -z <host_or_ip> <port> 1>/dev/null 2>&1; result=$?;

if [ $result -eq 0 ]; then
    echo 'the port is open for tcp connections'
else
    echo 'the port was closed'
fi

1

使用命令:

nmap 192.168.56.101

这将导致该计算机上打开的端口数以及服务名称


除了nmap此以外,使用其他任何方法都是在恕我直言。要检查单个端口,应使用nmap -p5454 192.168.56.101
jwg

这仅回答标题,但不回答实际问题。
JZeolla

是。我只是在指示方向。他必须走路才能得到想要的答案。:)
SHW 2013年

1

尝试确定进程是否绑定到TCP端口的最佳工具是netstat。您可以像这样运行它,以获取绑定的进程名称(如果有)的列表,以及与端口的任何连接及其状态。

$ netstat -tapn | head -15
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:49006               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:17500               0.0.0.0:*                   LISTEN      3516/dropbox        
tcp        0      0 0.0.0.0:17501               0.0.0.0:*                   LISTEN      3517/dropbox        
tcp        0      0 0.0.0.0:2143                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 127.0.0.1:1986              0.0.0.0:*                   LISTEN      2757/mono           
tcp        0      0 0.0.0.0:2025                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 
tcp        0      0 192.168.1.20:58286          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:54000          174.37.23.130:6667          ESTABLISHED 2696/pidgin         

上面显示了第三列中本地打开的端口和我们愿意接受的连接的远程端口,例如以下两行:

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   

这两条线表明我们正在监听端口22(sshd),并愿意接受来自我们拥有的任何接口(即任何网卡,以太网或无线)的连接。当前没有与此端口的连接。

第二行显示我们正在端口631上运行CUPS服务器(用于打印),我们只能通过localhost(127.0.0.1)接口连接到它。

再往下,我们有以下两行:

tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 

这表明我们正在访问IP地址为198.252.206.25的网站。我们知道这是一个网站,因为我们正在通过端口80(HTTP)访问此服务器。另外,如果我们查找IP地址,则会发现以下内容:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.