TCP bağlantı noktasının açık olup olmadığını nasıl anlarım? [kapalı]


9

C soket programlama uygulamak çalışıyorum. Bir istemciden bir sunucuya (Ubuntu) bağlanmaya çalıştığınızda, "bağlantı başarısız" gibi bir hata gösterir.

Bence sorun limanda. Soket programlama için 5454 / tcp portunu kullanıyorum.

5454 portunun dinleyip dinlemediğini nasıl bilebilirim? Değilse, Ubuntu'da C kullanarak TCP soket programlama için kullanabileceğim portlar hangileridir? LINUX Ubuntu'da yalnızca bağlantı noktasıyla ilgili sorun mu var veya kodumda yanlış bir şey mi var veya herhangi bir ayar gerekli mi?

EDIT: Kod pasajı:

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

EDIT : Sorun bağlantı noktasında, bu yüzden sadece Ubuntu yeniden yükledim ve çalışıyor. Hepinize teşekkür ederim.


ilk olarak, 5454 numaralı bağlantı noktasının durumu dinlemesi gerekir, Sonra bağlanın. ikinci güvenlik duvarınızı kontrol edin.
PersianGulf

Her zaman denerim lsof -i:5454(bağlantı noktasını açan programla aynı kullanıcı olarak veya root olarak yürütmeniz gerekebilir).
Carlos Campderrós

sunucu kodu nerede (ya da sunucu var olan bir program) Kukla bir sunucu çalıştırmak istiyorsanız, nc'nin (netcat) arkadaşınız olduğunu unutmayın.
Foon

Yanıtlar:


10

CI'da programlama yaptığınızdan, portun açık olup olmadığını gösteren küçük bir snippet yayınlamayı düşündüğünüz için, bir dize çıkışı programladım. İhtiyacınıza göre kolayca değiştirebilirsiniz.

İkinci sorunuza cevap verin, burada herkesin söylediği gibi, eğer bağlantı noktası başka bir uygulama tarafından kullanılmıyorsa, sistemdeki süper kullanıcı (kök) iseniz hemen hemen herhangi bir bağlantı noktasını kullanabilirsiniz. Kök değilseniz, 1024'ün üzerindeki herhangi bir bağlantı noktasını açabilirsiniz.

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

Mükemmel! kullanarak limanların durumunu kontrol etmenin yolu
Valentin Bajrami 27:13

Ben "biraz pasajı" sözünü seviyorum ^ ^. Ama çok bilgilendirici bir snippet için +1.
Olivier Dulac

Bu kodun yeni fork () işlemlerini gerçekleştirebilecek diğer iş parçacıklarıyla eşzamanlı olarak çalışması durumunda SOCK_CLOEXEC, socket()çağrı için belirterek soket dosya tanımlayıcısının düzgün bir şekilde kapatıldığından emin olunması gerektiğini unutmayın .
Ton van den Heuvel

5

Birkaç yol vardır, en yaygın olanı muhtemelen:

# netstat -ltun

Elbette, grepdiğer (normal) ifadeler için de kullanabilirsiniz.

Farklı makineler (istemci ve sunucu) kullanıyorsanız, kontrol etmeniz de gerekir iptables.

Şu anda programlarınız için kullanılmayan herhangi bir bağlantı noktasını kullanabilirsiniz. Ancak /etc/servicesbilinen ve ayrılmış bağlantı noktalarını kontrol edin.


Doğrudan "netstat -ltun" ile dinleme durumunda tcp / udp bağlantı noktalarını listeleyebilirsiniz
dsmsk80

netstat -an kullandığımda | grep LISTEN Orada sadece iki tcp prots ve geri kalanları UDP portlarını gösteriyor. Şimdi 5454 portunu aktif etmek istersem nasıl aktif olurum?
dxr

@ dsmsk80 ah, sanırım kötü alışkanlıklar çok ölüyor. Düzeltildi.
dawud

1

TCP bağlantı noktasının açık olup olmadığını ( http://wi-fizzle.com/article/458 ) kontrol edin

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

Komutunu kullanın:

nmap 192.168.56.101

Hizmetlerin adıyla birlikte bu makinede açılan bağlantı noktalarının sayısıyla sonuçlanır.


Bunun nmapiçin başka bir şey kullanmak çalı IMHO etrafında atıyor. Tek bir bağlantı noktasını kontrol etmek için kullanmalısınız nmap -p5454 192.168.56.101.
jwg

Bu sadece başlığa cevap verir ancak asıl soruya cevap vermez.
JZeolla

Evet. Sadece yönü gösteriyordum. İstenen cevabı almak için yürümesi gerekiyor. :)
SHW

1

Bir işlemin bir TCP bağlantı noktasına bağlı olup olmadığını belirlemeye çalışmak için en iyi araçtır netstat. Varsa, bağlanan işlemin adının yanı sıra bağlantı noktasına yapılan bağlantıların yanı sıra durumlarının bir listesini almak için bu şekilde çalıştırabilirsiniz.

Misal

$ 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         

Yukarıdaki, 3. sütundaki yerel olarak açılan bağlantı noktaları ve bu 2 satır gibi bağlantı kabul etmek istediğimiz uzak bağlantı noktalarını gösterir:

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      -                   

Bu 2 hat 22 numaralı bağlantı noktasını (sshd) dinlediğimizi ve sahip olduğumuz herhangi bir arabirimden (örn. Herhangi bir ağ kartı, ethernet veya kablosuz) bağlantı kabul etmeye istekli olduğumuzu göstermektedir. Şu anda bu bağlantı noktasına bağlantı yok.

İkinci satır, bağlantı noktası 631'de (yazdırma için) CUPS sunucusunu çalıştırdığınızı gösterir ve sunucuya yalnızca localhost (127.0.0.1) arabirimi üzerinden bağlanabiliriz.

Daha aşağıda bu 2 hat var:

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 

Bu da 198.252.206.25 IP adresinden bir web sitesine eriştiğimizi gösteriyor. Bunun bir web sitesi olduğunu biliyoruz çünkü bu sunucuya 80 numaralı bağlantı noktası (HTTP) üzerinden erişiyoruz. Ayrıca IP adresini ararsak şunu buluruz:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.