Netzwerk/Socket-Programmierung: logischer Aufbau

frager

Erfahrenes Mitglied
Hallo!

Ich habe mich jetzt zum ersten mal mit sockets befasst, und es klappt im Moment nicht so wie ich das will :) Das Ziel ist es ein Server- und ein Client-Programm zu erstellen, die ungefaehr nach dem folgenden Schema kommunizieren:
Code:
Client connectet zum Server
Client message an server
Server message an client
Client message an server
[...] usw..
Client oder server schliesst die Verbindung

Der aufbau vom Client ist bei mir folgender:
Code:
main
{

	WSAStartup(..)
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	connect(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr));
	do {
		send(sockfd, cmd, (int)strlen(cmd), 0)
		bytercv = recv(sockfd, cmd, 1024, 0);
		cout << cmd << endl;
	} while(strcmp(cmd, "quit"));
	closesocket(sockfd);
	WSACleanup();

	return 0;
}

Der Aufbau vom Server:
Code:
main
{
	WSAStartup(..)
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	bind(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr));
	while(listen(sockfd, 2) != -1) {
		sockfd_inc = accept(sockfd, (sockaddr*)&client_addr, &client_addr_size));
		bytercv = recv(sockfd_inc, buf, 1024, 0);
		buf[bytercv] = 0;
		cout << buf;
		cout << " [OK]" << endl;
		strcpy_s(buf, 1024, "OK");
		send(sockfd_inc, buf, (int)strlen(buf), 0);
	}
	closesocket(sockfd);
	WSACleanup();

	return 0;
}

Das funktioniert im moment aber alles irgendwie nicht, beim ersten recv bleibt alles stehen (nachdem alles eig. schon empfangen wurde) .. :(

Koennt ihr vllt helfen? :)

danke und mfg frager
 
Was soll "main" ?
Da fehlt doch was
Was schreibst du denn: Konsole, API, MFC?
Jedenfalls, Probiers einmal mit der Klasse CSocket.
Kann dir ein beispiel schreiben
wenn du eines brauchst
 
Hallo,

die "listen()"-Funktion beim Server wird nur einmal aufgerufen, also nicht wie bei dir bei jedem Schleifendurchlauf. Sollte dann etwa so aussehen:
C++:
bind(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr));
listen(sockfd, 2);

while(1)
{
    // ...
}
Außerdem solltest du beachten, dass die "recv()"-Funktion blockiert, wenn es nichts zu empfangen gibt. Hier musst du das Empfangen/Senden pro Client entweder in einen eigenen Thread auslagern oder mit der "select()"-Funktion überprüfen, ob bei den verbundenen Clients Daten zum Empfang anstehen.

Gruß
MCoder
 
Zurück