PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++] Socket Probleme



red_rapid_fire
27-12-2002, 18:43
Hi,
ich habe wieder mal Probleme mit denSockets in C++. Diesmal handelt es sich um Befehle accept() und recv() Also zuerst muss ja accept aufgerufen werden um die 'Verbindungsanfragen' aus der Warteschleife zu holen!?! Danach kann ich mit recv die 'Dateien' empfangen!?! Ich dachte es wäre einfach durch folgenden Code zu lösen,
for ( ; ; )
{
Accept = accept(Socket, (struct sockaddr *)&cli, cli_size);
printf("Verbindung von %s\n", inet_ntoa(cli.sin_addr));
close(Accept);
}
while(Empfangen!=0)
{
_ _Empfangen=recv(Socket,EmpfangeneDaten,1024,0);
_ printf("Daten: %s", EmpfangeneDaten);
_ close(Empfangen);
}
doch accept befindet sich in einer Endlosschleife, und dadurch wird ja recv() nie aufgerufen!! Darum habe ich versucht recv() in die for schleife zu integrieren
for ( ; ; )
{
Accept = accept(Socket, (struct sockaddr *)&cli, cli_size);
printf("Verbindung von %s\n", inet_ntoa(cli.sin_addr));
while(Empfangen!=0)
{
Empfangen=recv(Socket,EmpfangeneDaten,1024,0);
close(Empfangen);
}
printf("Daten: %s", EmpfangeneDaten);
close(Accept);
}
doch auch das funktioniert irgendwie nicht!! Was mache ich nur falsch??

mfg rrf

f0rtex
27-12-2002, 20:01
So sollte es funktionieren. Ersetze einfach die Variablen conn durch Accept und die anderen durch die entsprechenden Variablen in deinem Programm. Bin zu faul ;)



...
int amount;
char buff[1024];
....
while((conn = accept(sock, (struct sockaddr *) &address, &addrLength)) >= 0) {
printf("---- Hole Data ----\n");
while((amount = recv(conn, buff, sizeof(buff), 0)) > 0) {
if(write(0, buff, amount) != amount) {
die("write");
return;
}
}
printf("---- Fertig ----\n");
close(conn);
}

red_rapid_fire
27-12-2002, 20:33
winsock2.cpp:91: `addrLenght' undeclared (first use this function)
winsock2.cpp:91: (Each undeclared identifier is reported only once
winsock2.cpp:91: for each function it appears in.)
winsock2.cpp:97: implicit declaration of function `int die(...)'
irgendwie ist da wohl noch was falsch, meintest du wierklich &addrLenght und die()??

mfg rrf

tkortkamp
27-12-2002, 21:13
So sollte es funktionieren. Ersetze einfach die Variablen conn durch Accept und die anderen durch die entsprechenden Variablen in deinem Programm. Bin zu faul
Wie f0rtex schon schrieb musst du die Variablen aus seinem Code-Beispiel noch auf deine anpassen. addrLength in cli_size usw.

c ya,
Tobias

f0rtex
27-12-2002, 21:20
Hier noch der Code der Funktion die



void die(char * message){
perror(message);
exit(1);
}

red_rapid_fire
27-12-2002, 21:50
OK, THX jetzt kommen keine Fehlermeldungen mehr!! Nur noch ein kleines problem habe ich, es kommr zwar in der Konsole 'Daten: ' aber eigentlich sollte dahinter noch irgendein String komen(z.B. Meine ersten Sockets) Liegt dieser Fehler beim Senden(send()) oder beim Empfangen(recv())??

mfg rrf

f0rtex
27-12-2002, 22:16
zeige mal deine Send-Funktion

red_rapid_fire
28-12-2002, 10:13
hi,
hier ist mein Send() Teil



int Send;
char msg[] = "Meine ersten Sockets\n";

Send = send(Socket,msg, strlen(msg), 0);
if (Send < 0)
{
printf("Senden fehlgeschlagen");
}

mfg rrf

f0rtex
28-12-2002, 12:36
Versuch mal das strlen(msg) durch ein sizeof(msg) zu ersetzen.

red_rapid_fire
28-12-2002, 13:55
Mhh... funktioniert immer noch nicht :-/

mfg rrf

f0rtex
28-12-2002, 14:09
Habe nun dein Code-Fragment in mein Programm eingefügt. Es funktioniert bei mir prächtig.
Ich vermute, dass du den Socket nicht richtig initialisierst.
Poste mal deine socket() und connect() Code-Fragmente.

MfG
f0rtex

red_rapid_fire
28-12-2002, 14:16
hi,
so sieht mein socket() und connect() Teil aus.(Client)


int Socket;
int Send;
struct sockaddr_in addr;
inet_aton("169.254.217.28", &addr.sin_addr);
addr.sin_port = htons(6666);
addr.sin_family = AF_INET;
Socket = socket(AF_INET, SOCK_STREAM, 0);
if (Socket < 0)
{
printf("Socket erstellung Fehlgeschlagen\n");
}
if (connect(Socket, (struct sockaddr *)&addr, sizeof(addr)) == -1)
{
perror("connect() failed");
return 2;
}

Und so beim Server




my_addr.sin_port = htons(6666);
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
Socket = socket(AF_INET, SOCK_STREAM, 0);
if (Socket < 0)
{
printf("Socket erstellung Fehlgeschlagen\n");
}
Bind = bind(Socket,(sockaddr *)&my_addr,sizeof(sockaddr));
if (Bind < 0)
{
printf("Probleme mit Bind");
}

mfg rrf

red_rapid_fire
29-12-2002, 18:13
Also ich hab mir nochmal Tutorials zur Socketprogrammierung angeschaut, und eigentlich sollte es so funktionieren(aussert das Tutorial war falsch!!) Aber wen ich diesen Code Teil richtig verstanden habe, sollte wenn eine Verbindung akzeptiert/besteht wurde '---- Hole Data ----' ausegegeben werden??

....
while((conn = accept(sock, (struct sockaddr *) &address, &addrLength)) >= 0) {
printf("---- Hole Data ----\n");
.... Nur wird bei mir '--- Hole Data ---' nie ausgegeben!! :confused:

mfg rrf