Socket Anwendung...

DJ_Schorschi

Grünschnabel
Hallo,

ich möchte mit Visual C++ eine Socketanwendung programmieren mit der ich
dateien hin und her schicken kann.

Jetzt habe ich schon einiges gelesen wie z.B. //www.c-worker.ch/ aber so wie
es da beschrieben ist gehts bei mir nicht. Da funz nicht mal das kompillieren.

Bitte um Hilfe.

Gruss,
Schorschi.
 
moin


Hier 2 einfache Beispiele:

Server:
Code:
#include <winsock2.h>
#include <iostream>

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

using namespace std;

int main()
{
	WSADATA wsa;
	WSAStartup (MAKEWORD (1,1) ,&wsa);


	SOCKET s;
	s = socket (AF_INET, SOCK_STREAM, 0 );
		
	sockaddr_in addr;
	addr.sin_addr.s_addr = INADDR_ANY; 
	addr.sin_port = htons (1001);
	addr.sin_family = AF_INET;

	if(bind(s,(struct sockaddr*)&addr, sizeof(addr)) == -1)
	{
		cout<<"Fehler bei bind";
	}	
			
	if (listen(s,3) == -1)
	{
		cout<<"Fehler beim listen";
				
	}

         if (accept(s,(struct sockaddr*)&addr, 0) == -1)
	{
		cout<<"Fehler bei accept";
	}

	char buffer[10];

	int i = recv(s, buffer, 10, 0);
	buffer[i]='\0';
	cout<< buffer;

	cout<<"\nEnde";
	cin.get();
	return 0;
}


Client:
Code:
#include <winsock2.h>
#include <iostream>

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

using namespace std;

int main()
{
	WSADATA wsa;
	WSAStartup (MAKEWORD (1,1) ,&wsa);

	SOCKET s;
	s = socket (AF_INET, SOCK_STREAM, 0 );
			
	sockaddr_in addr;
	addr.sin_addr.s_addr = inet_addr("10.0.1.4"); 
	addr.sin_port = htons (1001);
	addr.sin_family = AF_INET;

	if(connect(s, (struct sockaddr*)&addr, sizeof(addr)) == -1)
		cout<<"Fehler beim connect";

	send(s, "X", 1, 0);

	cout<<"\nEnde";
	cin.get();
	return 0;
}


mfg
umbrasaxum
 
Hallo,


danke für die super Hilfe.
HAbe jetzt so im allgemeinen verstanden wie das funktioniert.

Allerdings hätte ich da noch ein paar grundlegende Fragen:

Wocher weiss ich welchen Port ich nehmen kann?
Muss ich die IP des Servers kennen oder gibt es andere möglichkeiten diese zu ermitteln,
um nicht jedes mal erst schauen zu müssen welche IP der Server hat?
Wie sieht es aus wenn mehrere Clients auf den Server zugreifen, geht das schon so
wie im Beispiel ober beschrieben?


Danke nochmals.

Gruss,
schorschi.
 
moin


Dein IP Problem kannst du mit gethostbyname() lösen.

Und nein der Code des Servers oben ist für einen Clienten, guck dir mal slect() an, damit kann man zwischen Clienten hin und her schalten.


mfg
umbrasaxum
 
Hallo,

mein Problem gestaltet sich ein wenig komplizierter, passt aber an den Thread mit ran. Ich lese nonblocking auf einem Socket und warte dann in einem Wait4MultipleEvents. Damit kann ich auch auf andere Ereignisse reagieren.

Jetzt passiert es mir regelmäßig, dass nach ca. 2500 Durchläufen das WSARecv mit WSAENOBUFS stirbt. Im Taskmanager laufen mir die Werte im nichtausgelagerten Pool bis auf 300K hoch. Ich hab schon 'dumme' Hinweise gefunden, gewisse Werte zu vergrößern - aber dann passiert der Überlauf nur später. Irgendeine Ressource wird hier sukzessive belegt, ohne wieder freigegeben zu werden.

Code:
if ((rc = WSARecv(this->hAcceptSock, &this->xSockInMessage->dataBuf,
	1, &len, &flags, &AcceptOverlapped, NULL)) == SOCKET_ERROR) {
	if ((dwError = WSAGetLastError()) != WSA_IO_PENDING) {
		this->log->Set(LOG_ERROR,"SockClient::LocalThread %d problem with %s: %d (%d)",
			id, inet_ntoa(acc_sin.sin_addr), dwError, this->read_cnt);
		LPWSABUF lpInboundDisconnectData = NULL;
		WSARecvDisconnect(this->hAcceptSock,lpInboundDisconnectData);
// WSAENOBUFS
		this->running = false;
		SetEvent(hParentAccept);
	} else {
		dwWait = WSAWaitForMultipleEvents(3, this->EventArray, FALSE, WSA_INFINITE, FALSE);
		WSAResetEvent(this->EventArray[dwWait - WSA_WAIT_EVENT_0]);
	}
}

Vielen Dank - freundliche Grüße.

Bobbin.
 
Morgen,


so jetzt bin ich mal soweit dass ich ne Server Client Verbindung programmieren kann.

Nun Stellt sich mir die Frage wie dass mit den Ports aussieht? Welche darf ich verwenden?
Gibt es ev. ne Auflistung der Ports welche da was sind und welche man nehmen muss?

Habe mir auch die select() Funktion angeschaut, da ich nen Server benötige auf den mehrere Clients zugreifen. Aber so richtig verstanden habe ich es nicht. Wie sieht es da dann aus? Habe ich dann einen Port auf den all die Clients zugreifen.

Danke für eure Hilfe,
Gruss Schorschi.
 
Moin,

also man unterschreidet hier zwischen den well known / privileged ports im Adressierungsberreich 0 bis 1023. Diese sollten nicht verwendet werden weil hier Standartanwendungen untergebracht sind (z.B. HTTP).

Die registered ports liegen im Bereich 1024 bis 49151 und sind weniger bedeutsam und Anwendungen wie IRC oder MySQL zugewiesen. Hier gibt es allerdings lücken die man nutzen kann 2083-2086 z.B.

Der Bereich dynamic and/or private ports liegt im Bereich 49152 bis 65535 und ist zur internen Verwendung gedacht.

Eine Tabelle kannst du hier finden mit noch einigen Informationen http://www.chebucto.ns.ca/~rakerman/port-table.html

und hier noch mal die offizielle IANA Port list
http://www.iana.org/assignments/port-numbers
Gruß
André
 
Zuletzt bearbeitet:
Cool,


danke für die Tabellen.

Ich habe bis jetzt nur auf meinem Rechner getestet mit dem local host.
Geht alles wunderbar.

Jetzt wollte ich die server routine auf meinem 2. Rechner laufen lasse und siehe da es
geht nicht. Welche dll's brauche ich da.

Bei mir kommt immer die fehlermeldung dass die Anwendung nicht initaliert werden konnte .....

Hab da mal noch ne Frage.
Ein Kumpel hat mir grad was von der MFC Klasse erzählt.
Was ist da der Unterschied zu diesem Winsock

Langsam blicke ich nicht mehr durch..

Gruss,
schorschi.
 
Zuletzt bearbeitet:
Hallo,

kann mir denn keiner sagen welche dlls ich brauche um die oben beschriebene soft auf nem rechner ohne Entwicklungsumgebung zum laufen zu kriegen.

Habe schon die winsock lib und alle winsock dlls die ich gefunden habe reinkopiert. Aber es kommt immer noch die Fehlermeldung dass die Anwendung nicht initialisiert werden kann.

Auf dem Rechner auf dem ich das visual studio drauf habe läuft es einfwandfrei.

Hab noch einige Tests gemacht. Auf meinem Rechner (m. Visual Studio) läufts OS W2k.
Auf dem Rechner von meinem Kumpel gehts auch der hat die gleiche Konstellation.

Auf meinem Testrechner WinXP ohne Visual Studio tritt die oben genannte Fehlermeldung auf. Auf dem Notebook mit W2k und älterem VisualStudio kommt die Fehlermeldung dass die dll mscoree.dll nicht gefunden wurde. Diese habe ich aber auf keinem meiner Rechner.

?

Bin inzwischen ziemlich Ratlos.

Danke für die Hilfe,
Schorschi.
 
Zuletzt bearbeitet:
Zurück