Usiłuję zaimplementować programowanie gniazd w C. Gdy próbuję połączyć się z klientem do serwera (Ubuntu), pojawia się błąd „połączenie nie powiodło się”.
Myślę więc, że problem dotyczy portu. Korzystam z portu 5454 / tcp do programowania gniazd.
Skąd mam wiedzieć, czy port 5454 nasłuchuje, czy nie? Jeśli nie, to jakich portów mogę użyć do programowania gniazd TCP za pomocą C w Ubuntu? Czy to jest problem tylko z portem, czy coś jest nie tak z moim kodem, czy wymagane są jakieś ustawienia w Linuksie Ubuntu?
EDYCJA: Fragment kodu:
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);
EDYCJA : Problem jest w porcie, więc właśnie zainstalowałem Ubuntu i działa. Dziękuję wam wszystkim.
lsof -i:5454
(może być konieczne wykonanie go jako ten sam użytkownik, co program otwierający port lub jako root).Odpowiedzi:
Ponieważ programujesz w CI pomyślałem o opublikowaniu małego fragmentu, który pokazuje, czy port jest otwarty, czy nie, zaprogramowałem, aby wyprowadzał ciąg. Możesz go łatwo zmienić w zależności od potrzeb.
Odpowiedz na drugie pytanie, jak wszyscy tutaj mówili, możesz w zasadzie korzystać z dowolnego portu, jeśli jesteś superużytkownikiem (root) w systemie, jeśli port nie jest używany przez żadną inną aplikację. Jeśli nie jesteś rootem, możesz otworzyć dowolny port powyżej 1024.
źródło
SOCK_CLOEXEC
dlasocket()
wywołania.Istnieje kilka sposobów, najprawdopodobniej najczęściej:
Możesz oczywiście użyć
grep
innego (regularnego) wyrażenia.Jeśli używasz różnych maszyn (klienta i serwera), musisz również sprawdzić
iptables
.Możesz używać praktycznie dowolnego portu, który nie jest aktualnie używany dla twoich programów. Sprawdź jednak
/etc/services
znane i zarezerwowane porty.źródło
Sprawdź łącze ( http://wi-fizzle.com/article/458 ), czy port TCP jest otwarty, czy nie
źródło
Użyj polecenia:
nmap 192.168.56.101
Spowoduje to liczbę portów otwartych na tym komputerze wraz z nazwą usług
źródło
nmap
tym do bicia wokół buszu IMHO. Aby sprawdzić pojedynczy port, powinieneś użyćnmap -p5454 192.168.56.101
.Najlepszym narzędziem do próby ustalenia, czy proces jest powiązany z portem TCP, jest
netstat
. Możesz uruchomić go w taki sposób, aby uzyskać listę nazw związanych procesów, jeśli są powiązane, a także wszelkich połączeń z portem, a także ich stanu.Przykład
Powyżej pokazuje lokalnie otwarte porty w trzeciej kolumnie i porty zdalne, do których jesteśmy gotowi akceptować połączenia, na przykład za pomocą tych 2 linii:
Te 2 wiersze pokazują, że nasłuchujemy na porcie 22 (sshd) i jesteśmy gotowi zaakceptować połączenia z dowolnego interfejsu, który mamy (tj. Z dowolnej karty sieciowej, ethernetowej lub bezprzewodowej). Obecnie nie ma połączeń z tym portem.
Drugi wiersz pokazuje, że uruchamiamy serwer CUPS (do drukowania) na porcie 631 i możemy się z nim połączyć tylko przez interfejs localhost (127.0.0.1).
Dalej mamy te 2 linie:
Które pokazują, że uzyskujemy dostęp do strony internetowej pod adresem IP 198.252.206.25. Wiemy, że jest to witryna internetowa, ponieważ uzyskujemy dostęp do tego serwera przez port 80 (HTTP). Ponadto, jeśli sprawdzimy adres IP, znajdziemy to:
źródło