So Erstellen Sie eine TCP-socket-Verbindung verwenden Sie C, um einen vordefinierten port

StackOverflow https://stackoverflow.com/questions/204169

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe eine sehr einfache Frage.Ich möchte testen, ob ein bestimmter port ist derzeit in Verwendung ist oder nicht.Für dieses, ich möchte zum binden eines TCP-socket an den port, wenn die Verbindung abgelehnt bedeutet, dass der port verwendet wird und wenn nicht, dass bedeutet, dass der port frei.

Kann mir bitte jemand sagen, wie kann ich schreiben die TCP-socket-code in C?Ich bin auf einer solaris-Plattform.

Ich weiß, das ist sehr basic.Aber ich Schätze Ihre Hilfe.Vielen Dank im Voraus.

War es hilfreich?

Lösung

Die Anruffunktion zu binden, wird -1 zurück, wenn ein Fehler auftritt. Dies schließt den Fall, wo die Adresse bereits verwendet wird.

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 12345

int main()
{
  struct sockaddr_in addr;
  int fd;

  fd = socket(AF_INET, SOCK_STREAM, 0);
  if(fd == -1)
  {
      printf("Error opening socket\n");
      return -1;
  }

  addr.sin_port = htons(PORT);
  addr.sin_addr.s_addr = 0;
  addr.sin_addr.s_addr = INADDR_ANY;
  addr.sin_family = AF_INET;

  if(bind(fd, (struct sockaddr *)&addr,sizeof(struct sockaddr_in) ) == -1)
  {
      printf("Error binding socket\n");
      return -1;
  }

  printf("Successfully bound to port %u\n", PORT);
}

Andere Tipps

Es hängt davon ab, etwas, was genau Sie versuchen zu testen.

Verwendung bind() in der Weise, dass joelc vorgeschlagen, wird Ihnen sagen, wenn der port offen ist alle - Schnittstelle auf Ihrem Computer.Obwohl um gründlich zu sein, sollten Sie nicht nur die überprüfung der Rückgabewert von bind(), sondern auch die überprüfung errno == EADDRINUSE.

ie.(änderung der joelc code)


if(bind(socket, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) ) == -1)
{
    if( errno == EADDRINUSE )
    {
        // handle port already open case
    }
    else
    {
        // handle other errors
    }
}

Durch ändern der Adresse in der Zeile:zB.


    sin.sin_addr.s_addr = inet_addr("192.168.1.1");

...können Sie testen, ob ein port verfügbar ist, auf eine bestimmte Schnittstelle.

Seien Sie sich aber bewusst, dass dies nicht der perfekte test für port-Status.Wenn ein anderer Prozess den port offen und wurde beendet, bevor es ordnungsgemäß geschlossen port (ie.vor dem Aufruf close() auf dem sockel), dann bekommen Sie in der Regel die gleichen EADDRINUSE Fehler.(je nachdem, ob die SO_REUSEADDR-option gesetzt wurde, die auf die Buchse)

(Seite Hinweis:es sei denn, Ihr test-Anwendung läuft mit ausreichenden Zugriffsrechten, die Sie nicht in der Lage zu binden (), um alle ports unterhalb 1024)

Als Anonyme vorgeschlagen, können Sie auch einen Blick auf netstat.Diese werden geben Sie alle die gleichen Informationen, die Sie erhalten können, indem Sie wiederholt aufrufen bind() viel schneller und ohne die Nebenwirkungen (wie Sie nicht haben, um tatsächlich binden sich an die ports, die machen Sie Sie unbrauchbar, um andere Prozesse).Einfach anrufen netstat -a --numeric-ports -t und analysieren Sie die Ausgabe sollte Ihnen alles, was Sie suchen.

Ein Kommentar auf moogs Vorschlag, obwohl - Aufruf von telnet an jedem Anschluss wird Ihnen nur sagen, wenn ein socket lauscht auf diesem port nicht, ob es tatsächlich geöffnet ist.

Wollen Sie nur testen, ob der jeweilige Port befindet sich derzeit im Einsatz? (Und nicht wirklich braucht, um ein Programm zu machen). Wenn ja, können Sie Telnet verwenden:

  

Telnet-Host-Port

Wenn die Verbindung fehlschlägt, ist es nicht in Gebrauch ist. Wenn es verbindet und wartet auf Eingabe von Ihnen, es ist im Einsatz:)

Sie können auf den Quellcode von netstat zu suchen. Ich glaube, dass es ein netstat in Solaris ist als gut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top