Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Double Socket


Messages recommandés

Invité sivaller
Posté(e) (modifié)

Bonjour,

 

Il y a quelque chose que je ne comprend pas,

j'ai conçu un projet Client/Server , et

le programme client utilise 2 sockets TCP (un pour les requete distante) , l'autre pour les messages (message administratives,message arret serveur,message deconnexion). Le programme client se connecte 2 fois et meme port pour avoir 2 sockets.

 

Ce que je ne comprend pas Winsock retourne au niveau du serveur une erreur comme quoi le socket distance à été déconnecté et que ce n'est pas le cas.

 

Pourtant les 2 sockets sont en mode keep-alive au client et serveur.

Dans le programme client j'utilise ioctlsocket et recv pour recevoir les données et au serveur j'utilise wsaasyncselect.

 

Programme client :

int connectserver(char* host)
{
sockaddr_in skaddr;
tv.tv_sec = 30000;  /* 30 Secs Timeout */
int hsocket;
hsocket=socket(Internet,Stream,0);
if (hsocket!=-1)
{
	ZeroMemory(&skaddr,sizeof(skaddr));
	skaddr.sin_family=Internet;
	skaddr.sin_port=swap(1002);
	unsigned long l=HostToLong(host);
	skaddr.sin_addr.S_un.S_addr=l;
	if (connect(hsocket,(sockaddr*)&skaddr,sizeof skaddr)!=0)
	{
		closesocket(hsocket);

		return 0;
	}

	setsockopt(hsocket, SOL_SOCKET, SO_RCVTIMEO,(const char*)&tv,sizeof(struct timeval));
	setsockopt(hsocket, SOL_SOCKET, SO_SNDTIMEO,(const char*)&tv,sizeof(struct timeval));

	BOOL bOptVal = TRUE;
 int bOptLen = sizeof(BOOL);
 int iOptVal;
 int iOptLen = sizeof(int);
 setsockopt(hsocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&bOptVal, bOptLen);


	return hsocket;
}
return 0;
}

 

Programme serveur en Pascal

case msg.lParam of
 FD_ACCEPT: begin
	   // log('Demande de connexion');
		//if (nombreconnection+1<=nombreconnectionmax) then begin
//				 inc(nombreconnection);
			scknew :=  accept(msg.wparam,0,0);
			setcode(scknew,$4555);
			i := getcode(scknew);;
		   // sendbuf(msg.wparam,@i,2);
			WSAASyncSelect(scknew,principale.Handle,WM_USER,FD_CLOSE or FD_CONNECT or FD_ACCEPT or FD_READ);
			tv.tv_sec := 5000;
			tv.tv_usec := 500;
			setsockopt(scknew, SOL_SOCKET, SO_RCVTIMEO,@tv,sizeof(tv));
				setsockopt(scknew, SOL_SOCKET, SO_SNDTIMEO,@tv,sizeof(tv));
			bk := true;
			setsockopt(scknew, SOL_SOCKET, SO_KEEPALIVE, @bk, 1);
		//end else
		//  closesocket(msg.WParam);


			end;
 FD_CONNECT:begin
		   // nombreconnection := nombreconnection;

			end;

 

Je ne comprend pas pourquoi ca deconnecte au niveau du client pourtant je ne ferme pas le socket.

 

Pouvez-vous me répondre à (pas d'adresse mail sur le forum) aprés le 18 aout 2008 , merci SVP

 

Merci de votre aide.

Modifié par KewlCat

Posté(e)

salut,

 

eh j'ai pas etudié tout le code, mais eh "closesocket(msg.WParam);" me parrait bizare... ne serait-ce pas plutot "closesocket(scknew);" ?

 

Autre chose qui ne corrigera pas ton probleme, mais eh "ZeroMemory" en C ? un appel extern pour mettre un buffer a 0 ?

 

ensuite:

BOOL bOptVal = TRUE;

int bOptLen = sizeof(BOOL);

int iOptVal;

int iOptLen = sizeof(int);

setsockopt(hsocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&bOptVal, bOptLen);

 

hum vraiment j'ai du mal a comprendre la, deja y a au moins deux variables unitiles, les 2 autres je vois pas trop leur interret!

 

++

  • 2 semaines après...
Posté(e) (modifié)

Salut,

 

J'ai écris déjà quelques logiciels client/serveur mais sans avoir pratiqué winsock, du moins pas directement.

Pour ma part, je préfère l'utilisation de sockets bloquants avec multithreading.

 

Evidemment ton code est très incomplet. Il y a les parties que l'on ne voit pas et pour celles que l'on voit, tu es loin du compte concernant le traitement des erreurs. Il est par ailleurs porteur de quelques absurdités. Des variables qui ne servent à rien comme sebdraluorg l'a remarqué mais aussi des concepts totalement erronés. Ainsi par exemple, WSAASyncSelect sert à spécifier les messages que ton serveur doit recevoir mais tu l'utilises en plein milieu d'un de ces messages qu'il est sensé définir. De même, d'un point de vue serveur FD_CONNECT n'a aucun intérêt, cela ne concerne que les clients.

 

Je te conseille de regarder ici : http://sylvainmarechal.chez-alice.fr/prog/...ket/socket.html

Et de travailler plus sérieusement le sujet car il est assez compliqué voire épineux.

Modifié par _Michel_

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...