Ich versuche, Socket-Programmierung in C zu implementieren. Wenn ich versuche, von einem Client aus eine Verbindung zu einem Server (Ubuntu) herzustellen, wird ein Fehler wie „Verbindung fehlgeschlagen“ angezeigt.
Ich denke also, dass das Problem am Port liegt. Ich verwende den Port 5454/TCP für die Socket-Programmierung.
Wie kann ich feststellen, ob Port 5454 lauscht oder nicht? Wenn nicht, welche Ports kann ich dann für die TCP-Socket-Programmierung mit C in Ubuntu verwenden? Liegt das Problem nur am Port, oder stimmt etwas in meinem Code nicht, oder sind in LINUX Ubuntu irgendwelche Einstellungen erforderlich?
BEARBEITEN: Code-Schnipsel:
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);
BEARBEITEN: Das Problem liegt am Port, also habe ich Ubuntu einfach neu installiert und es funktioniert. Vielen Dank euch allen.
Antwort1
Da Sie in CI programmieren, dachte ich daran, einen kleinen Ausschnitt zu veröffentlichen, der Ihnen zeigt, ob der Port geöffnet ist oder nicht. Ich habe die Ausgabe einer Zeichenfolge programmiert. Sie können diese ganz einfach an Ihre Bedürfnisse anpassen.
Antwort auf Ihre zweite Frage: Wie alle hier gesagt haben, können Sie praktisch jeden Port verwenden, wenn Sie der Superuser (Root) auf dem System sind und der Port nicht von einer anderen Anwendung verwendet wird. Wenn Sie nicht der Root sind, können Sie jeden Port über 1024 öffnen.
#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;
}
Antwort2
Es gibt mehrere Möglichkeiten. Die gebräuchlichste ist wahrscheinlich:
# netstat -ltun
Sie können natürlich auch grep
andere (reguläre) Ausdrücke verwenden.
Wenn Sie unterschiedliche Maschinen (Client und Server) verwenden, müssen Sie dies iptables
ebenfalls überprüfen.
Sie können praktisch jeden Port verwenden, der derzeit nicht für Ihre Programme verwendet wird. Achten Sie jedoch /etc/services
auf bekannte und reservierte Ports.
Antwort3
Überprüfen Sie den Link (http://wi-fizzle.com/article/458) für den TCP-Port, ob dieser geöffnet ist oder nicht
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
Antwort4
Das beste Tool, um herauszufinden, ob ein Prozess an einen TCP-Port gebunden ist, ist netstat
. Sie können es wie folgt ausführen, um eine Liste mit den Namen der gebundenen Prozesse (sofern vorhanden) sowie mit allen Verbindungen zum Port und deren Status zu erhalten.
Beispiel
$ 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
Oben sind in der dritten Spalte lokal geöffnete Ports und Remote-Ports aufgeführt, zu denen wir Verbindungen akzeptieren, beispielsweise mit diesen beiden Zeilen:
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 -
Diese beiden Zeilen zeigen, dass wir auf Port 22 (sshd) lauschen und bereit sind, Verbindungen von jeder Schnittstelle zu akzeptieren, die wir haben (also jede Netzwerkkarte, Ethernet oder WLAN). Derzeit bestehen keine Verbindungen zu diesem Port.
Die zweite Zeile zeigt, dass wir den CUPS-Server (zum Drucken) auf Port 631 ausführen und nur über die Schnittstelle „localhost“ (127.0.0.1) eine Verbindung dazu herstellen können.
Weiter unten haben wir diese 2 Zeilen:
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
Das zeigt, dass wir auf eine Website mit der IP-Adresse 198.252.206.25 zugreifen. Wir wissen, dass es sich um eine Website handelt, weil wir über Port 80 (HTTP) auf diesen Server zugreifen. Wenn wir außerdem die IP-Adresse nachschlagen, finden wir Folgendes:
$ dig -x 198.252.206.25 +short
stackoverflow.com.