Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++] Socket Probleme
red_rapid_fire
27-12-2002, 19: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
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, 21: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, 22: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
Hier noch der Code der Funktion die
void die(char * message){
perror(message);
exit(1);
}
red_rapid_fire
27-12-2002, 22: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
zeige mal deine Send-Funktion
red_rapid_fire
28-12-2002, 11: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
Versuch mal das strlen(msg) durch ein sizeof(msg) zu ersetzen.
red_rapid_fire
28-12-2002, 14:55
Mhh... funktioniert immer noch nicht :-/
mfg rrf
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, 15: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, 19: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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.