TCP/IP-Verbindung
-
Hallo zusammen,
ich lese mich gerade zum Thema Netzwerkprogrammierung über TCP/IP ein. Ich möchte übers Netzwerk Daten von einem Windows-PC zu einer Linux-Maschine senden. socket(), bind(), listen() und accept() sind mir alle klar. Ich bin nur am Grübeln, ob man da nicht irgendwo die Hardware (eth0 oder so) engeben muss. Ich kenne das z.B. von der seriellen Schnittstelle. Da muss bei dem Befehl open() die Schnittstelle mit angegeben werden (z.B. /dev/ttyS0)
Hab ich da bei TCP/IP was überlesen?Kann mir diesbezüglich jemand eine gute Seite nennen oder einen Beispielcode posten?
Merci, Lazlo
-
Hier findest du Beispielcode fuer einen Einfachen Server und Client.
Etwas angeben wie eth0 ist nicht noetig. Wenn du die Funktionen socket & bind usw. verwendest, dann weiss hoffenltich das OS was du meinst![1] http://www.welzl.at/teaching/cn-alt/unterlagen/csockets/index.html
-
Danke für den Hinweis. Die Verbindung klappt. Jetzt habe ich aber auch noch eine andere Frage:
Ich möchte Port 502 nutzen (ist reserviert für das Modbus Protokoll, ich schreibe einen Modbus Slave)
Allerdings bekomme ich bei folgendem Code die darauf folgende Fehlermeldung:
(PORT_NUMBER ist definiert mit: #define PORT_NUMBER 502)int sockfd, i; struct sockaddr_in address; size_t addrlength = sizeof(struct sockaddr_in); if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) printf("error on socket\n"); i = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); address.sin_family = AF_INET; address.sin_port = htons(PORT_NUMBER); memset(&address.sin_addr, 0, sizeof(address.sin_addr)); if (bind(sockfd, (struct sockaddr *) &address, sizeof(address))) printf("error on bind\n"); if (listen(sockfd, 5)) printf("error on listen\n");
Fehlermeldung ist:
error on bind
Sobald ich lediglich
#define PORT_NUMBER 2233
ändere, funktioniert alles. Woran mag das liegen? Ich weiss, dass die Port-Nummern bis 1024(?) reserviert sind. Darf ich sie deswegen gar nicht nutzen? Oder muss ich noch irgendwas frei schalten?
Ich nutze SuSE 9.3Vielen Dank, Lazlo
-
Lazlo schrieb:
Woran mag das liegen? Ich weiss, dass die Port-Nummern bis 1024(?) reserviert sind. Darf ich sie deswegen gar nicht nutzen?
Doch, nur braucht der Prozess zum Zeitpunkt des binds root-Rechte. (Die solltest Du dann aber so schnell wie möglich wieder abgeben...)
-
Sorry für die Frage, aber wie geht das? Muss ich mich als Root einloggen, oder kann ich das auch irgendwie als normaler Nutzer machen?
-
Die unteren Portnummern sind reservierte Ports (durchsuch mal die RFCs, wenn du genaueres wissen willst). Daher hat man in Unix das so geregelt, dass untere Portnummern nur von root gebunden werden können, damit nicht jeder User einen normalen Port öffnen kann. Nimm einfach einen höheren Port, wenn du dein eigenes Protokoll definieren willst.
Standard Werk zu dem Thema
UNIX Network Programming | ISBN: 013490012X
-
Lazlo schrieb:
Sorry für die Frage, aber wie geht das? Muss ich mich als Root einloggen, oder kann ich das auch irgendwie als normaler Nutzer machen?
Die Lösung findest du hier in diesem Forum (ganz unten in dem Beitrag).
Nach dem bind() solltest du allerdings ein setuid(getuid()) ausführen, um die root-Rechte wieder abzugeben.
Martin