Winsock müllt den Speicher zu

sheel

I love Asm
hätte mit den winsockets ein Problem:

Vom Prinzip her ist in meinem Programm ein SOCKET-Pointer, der immer wieder einen speicherplatz bekommt, darauf ein socket erstellt wird, connect, ..., schließen, und den Speicherplatz freigeben.

Das passiert so in der Größenordnung 100 bis 10000 mal...

Jetzt bin ich draufgekommen, das bei jedem durchlauf dieser schritte zirka 1MB des Arbeitsspeichers belegt wird, der nicht wieder frei wird...
bei den 10000 mal verursacht das dann zeimlich schnell einen überlauf.

Ich bin mir nur nicht ganz sicher, ob das normal ist

Oder gibt es eine Funktion, die das woder aufräumt?

brauch das bitte dringend

danke schon im voraus

sheel
 
Naja, also da du die Sockets sicherlich mit new anlegst kannst du sie auch wieder mit delete löschen, dadurch kriegst du den belegten Speicher wieder, aber 1MB für ein Socket hört sich für mich etwas arg viel an.... Ich hab mal einen Portscanner gebaut auf Thread-Basis, da konnte ich ohne weiteres 1000Sockets erstellen.

Gruß
cesupa
 
Ich glaub du hast mich nicht ganz richtig verstanden...
der speicher ist auch noch belegt, wenn der socket schön längst wieder weg ist.

und mit der zeit häuft sich das ziemlich an
 
Dann zeig mal deinen Code. Eigentlich kann das nicht sein, was mit delete gelöscht wurde ist auch nicht mehr im Speicher zu finden.
 
schon,
das ist ja wohl weg.

aber der socket wird ja eigentlich nur als handle verwende,
könnte nicht die funktion socket(...),
die ihn am anfang initialisiert,
speicher reservieren für irgendwas?
 
Hi.
schon,
das ist ja wohl weg.

aber der socket wird ja eigentlich nur als handle verwende,
könnte nicht die funktion socket(...),
die ihn am anfang initialisiert,
speicher reservieren für irgendwas?
Ja, und man könnte sicherlich vortrefflich stundenlang darüber philosophieren was welche Funktion evtl. irgendwie macht oder nicht. Ich denke allerdings, das der Fehler mit Sicherheit in deinem Code zu suchen ist, und nicht im Socket Code. Also, wenn du deinen Code nicht zeigst, dann schließ das Thema denn es hat keinen Sinn.

Gruß
 
Das Programm, für das ich das brauche, lass ich hier einmal aus,
ich hab ein kleines Testproramm geschrieben, das genau das gleiche Problem hat
Ich verwende VC6

Ein "Server" rennt auf meinem Computer am Port 9000, der Client sieht so aus:

Code:
#include<windows.h>
#include<stdio.h>
#include<winsock2.h>

#pragma comment(linker,"ws2_32.lib")

void main()
{

SOCKET *s;
WSADATA w;
if(WSAStartup(MAKEWORD(2,0),&w)){Beep(1000,1000);return;}
SOCKADDR_IN sas;
memset(&sas,0,sizeof(SOCKADDR_IN));
sas.sin_family=AF_INET;
sas.sin_port=htons(9000);
sas.sin_addr.s_addr=inet_addr("127.0.0.1");
while(1)
{

s=new SCOKET;
(*s)=socket(AF_INET,SOCK_STREAM,0);
if(connect(*s,((SOCKADDR *)(&sas)),sizeof(sas))==SOCKET_ERROR)
{Beep(500,500);return;}
closesocket(*s);
delete s;

}

}
 
Hallo,

SOCKET brauchst du nicht als Zeiger zu verwenden, da es nur als Handle (unsigned int) verwendet wird. Der Socket
wird mit socket() erzeugt und mit closesocket() wieder aufgeräumt. Der Socket muss also nicht explizit mit "delete"
freigegeben werden, sondern kann immer wieder neu zugewiesen werden.

Die Socket-Funktionen verwenden Threads. Wenn du in deinem Hauptthread in der while-Schleife keine Rechenzeit
abgibst, wird die Luft für die anderen Threads ziemlich dünn. Das könnte der Grund dafür sein, dass nach closesocket() der
Speicher nicht sauber aufgräumt wird. Du solltest daher nach jedem Schleifendurchlauf ein "Sleep(50);" (der
Timeout-Wert ist nicht weiter entscheidend) einfügen.

Gruß
MCoder
 
Zurück