Socket et linux : serveur smtp

LuckyNut Messages postés 47 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 11 mars 2009 - 20 juin 2006 à 15:48
LuckyNut Messages postés 47 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 11 mars 2009 - 20 juin 2006 à 19:09
Bonjour,

J'ai développé un petit serveur smtp sous linux et j'ai un pb que je n'arrive pas à résoudre.
Il marche nickel si je le fais écouter sur le port 2525.

Par contre quand je le fais écouter sur le port 25, je remarque qu'un client windows s'y prend à 2 fois pour se connecter (avec un seul appel de connect pourtant).
Ca marche très bien avec un client linux.

Vous avez une idée du problème ?

3 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
20 juin 2006 à 17:45
L'appli est lancée par root ou un autre utilisateur?
0
LuckyNut Messages postés 47 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 11 mars 2009
20 juin 2006 à 18:02
L'appli est lancée par root.

Ce que je trouve bizarre c'est qu'avec un client sous linux tout est ok.

Je pensais au début que ca venait d'inetd qui foutait le boxon mais il n'y a aucun smtp de configuré...
0
LuckyNut Messages postés 47 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 11 mars 2009
20 juin 2006 à 19:09
Pour que ce soit plus clair, voici l'exemple de code du serveur :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include
#include





int main() {
 struct sockaddr_in SockLocale;
 
 int sock = socket(AF_INET, SOCK_STREAM, 0);
 if(sock==-1) exit(-1);
 
 memset(&SockLocale,0,sizeof(struct sockaddr_in));
 SockLocale.sin_family = AF_INET;
 SockLocale.sin_addr.s_addr = htonl(INADDR_ANY);
 SockLocale.sin_port = htons(25);



 if(bind(sock,(struct sockaddr*)&SockLocale,sizeof(struct sockaddr_in)) != -1) {
  if(listen(sock, 100)<0) {
   printf("Echec de Listen()\n");
   exit(-1);
  }
 }
 else {
  printf("echec de bind()\n");
  exit(-1);
 }
 
 while(1) {
  struct sockaddr_in SockDistant;
  char buffer[512];
  
  socklen_t TailleSock = sizeof(SockDistant);
  memset(&SockDistant,0,sizeof(struct sockaddr_in));
  int s_distant = accept(sock,(struct sockaddr*)&SockDistant,&TailleSock);
  if(s_distant!=-1) {
   printf("CONNEXION ETABLIE\r\n");
   strcpy(buffer,"Hello world !\r\n");
   write(s_distant,buffer,strlen(buffer));
   printf("Chaine "Hello world !" envoyée\r\n");
   close(s_distant);
  }
 }
}

Je teste en me connectant avec telnet :
Si je le mets sur le port 2525 (par ex), tout marche bien.
Sur le port 25, tout marche bien aussi à partir de linux.
Par contre, à partir de windows, j'obtiens (coté serveur) :

CONNEXION ETABLIE
Chaine "Hello world !" envoyée
CONNEXION ETABLIE
Chaine "Hello world !" envoyée

Vous voyez, il me l'affiche en double.
Je ne sais pas si ca ne vient pas la configuration de linux (debian) ou bien du programme.
Je ne comprends pas pourquoi ca marche avec telnet sous linux...
0
Rejoignez-nous