PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Socketprogrammierung ("netpipe")



detonation997
16-10-2003, 18:20
Hallo!

Ich möchte eine "NetPipe" programmieren. So quasi ein "|" übers Netzwerk (soll dazu dienen die Programme zum DVD-Rippen und Transcodieren auf mehrere Rechner zu verteilen. Die Programme werden im Moment auf einem Rechner ausgeführt und per "|" verbunden).

Ich kann mir auch gut vorstellen, dass es das schon gibt, ich möchts aber trotzdem selber programmieren...

Den momentanen Sourcecode poste ich im nächsten Thread.
Im Moment sieht die Sache so aus, dass es 2 Programme (von denen ich bis jetzt aber nur den Server geschrieben habe) gibt. Die Features:

Server:
=====

Lauscht auf Port 6187 auf eingehende Verbindungen und schreibt das, was er empfängt auf die Standardausgabe.

Client:
=====

Nimmt auf Standard-Input Daten entgegen und sendet sie an den Server. Diesen Teil erledigt im Moment Telnet für mich.

So, nun zum Code:

detonation997
16-10-2003, 18:29
#include <stdio.h>
#include <errno.h>
#include <string.h>

#ifdef _WIN32
#include <winsock.h>

#else
#include <netdb.h>
#include <unistd.h>
#endif

#define BUFFER_SIZE 1024

int main(int argc, char *argv[])
{
&nbsp;&nbsp;struct sockaddr_in my_addr, remote_addr;
&nbsp;&nbsp;socklen_t sin_size = sizeof(struct sockaddr_in);
&nbsp;&nbsp;int sock, connected_sock,received_bytes = 0;
&nbsp;&nbsp;char buffer[BUFFER_SIZE];

&nbsp;&nbsp;sock = socket(AF_INET,SOCK_STREAM,0);
&nbsp;&nbsp;if(sock == -1)
&nbsp;&nbsp;&nbsp;&nbsp; perror("socket()");

&nbsp;&nbsp;my_addr.sin_family = AF_INET;
&nbsp;&nbsp;my_addr.sin_port = htons(6187);
&nbsp;&nbsp;my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

&nbsp;&nbsp;if(bind(sock, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
&nbsp;&nbsp;&nbsp;&nbsp; perror("bind()");

&nbsp;&nbsp; if(listen(sock,5) == -1)
&nbsp;&nbsp; &nbsp;&nbsp; perror("bind()");

&nbsp;&nbsp; connected_sock = accept(sock, (struct sockaddr *)&remote_addr, &sin_size);
&nbsp;&nbsp; if(connected_sock == -1)
&nbsp;&nbsp;&nbsp;&nbsp; perror("accpet()");

&nbsp;&nbsp; fprintf(stderr,"Socketnummer (listening): %d\n",sock);
&nbsp;&nbsp; fprintf(stderr,"Socketnummer (angenommen): %d\n",connected_sock);

&nbsp;&nbsp; (void)setvbuf(stdout,NULL,_IONBF,0);

&nbsp;&nbsp; while(1)
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp; received_bytes = read(connected_sock,buffer,1024);

&nbsp;&nbsp;&nbsp;&nbsp; if(received_bytes == 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp; if(received_bytes == -1)
&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror("recv()");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp; &nbsp; &nbsp;&nbsp; }
&nbsp;&nbsp; &nbsp;&nbsp; if(write(1,(const void *)buffer,received_bytes) != received_bytes)
&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"...Fehler bei write!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(3);
&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"%d Bytes empfangen.\n",received_bytes);
&nbsp;&nbsp; }
&nbsp; &nbsp; return(0);
}

detonation997
16-10-2003, 18:32
Das Problem hab' ich, wenn ich auf "telnet" eine Eingabeumleitung mache:

z.B. "cat /etc/resolv.conf | telnet localhost 6187"

Dann beendet sich netpipe, als wenn nichts passiert wäre...
"received_bytes" ist also 0. (Abbruch per "break").

Wenn ich ganz normal per telnet auf port 6187 arbeite (also Eingabe nicht per Dateiumleitung sondern per Tastatur), dann funktionierts so halbwegs.

Kann es sein, dass "write" solange blockiert, bis es einen Zeilenumbruch ("\n") erhält?

Danke für jeden konstruktiven Beitrag,
mfg Rainer

anda_skoa
17-10-2003, 11:04
Vielleicht kann netcat schon was du suchst:
http://netcat.sourceforge.net/

Ciao,
_

Badsteve
18-10-2003, 13:19
hi,

dein Problem schein nicht der Server sondern der telnet-client zu sein.

Steve