|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
[C] Ascoltare connessione su più porte
Ciao a tutti.
Sto iniziando a sviluppare un semplice mail server. Visto che dovrò testare poi il mail server con i comandi SMTP e POP3 descritti nelle RFC, ho bisogno di capire come posso mettermi in ascolto sulla porta 110 e 25 contemporaneamente. Ho provato a creare 2 socket uno per l'SMTP e uno per il POP3 ma riesco a collegarmi con Telnet solo tramite SMTP. Questa è la funzione che ho creato per impostare i socket: Codice:
//POP3Socket e SMTPSocket sono definite extern //cfgParams sono i parametri di configurazione del server letti da un file void setWinSocket() { WSADATA WSStartData; if(WSAStartup(MAKEWORD (2,2), &WSStartData) != 0) PrintError("Can't support socket:"); struct sockaddr_in POP3SAddr; struct sockaddr_in SMTPSAddr; POP3Socket = socket(PF_INET,SOCK_STREAM,0); SMTPSocket = socket(PF_INET,SOCK_STREAM,0); if(POP3Socket == INVALID_SOCKET) PrintError("Failed POP3 socket() call"); if(SMTPSocket == INVALID_SOCKET) PrintError("Failed SMTP socket() call"); memset(&POP3SAddr,0,sizeof(POP3SAddr)); memset(&SMTPSAddr,0,sizeof(SMTPSAddr)); POP3SAddr.sin_family = AF_INET; POP3SAddr.sin_port = htons((cfgParams->POP3Port)); SMTPSAddr.sin_family = AF_INET; SMTPSAddr.sin_port = htons((cfgParams->SMTPPort)); if(bind(POP3Socket,&POP3SAddr,sizeof(struct sockaddr_in)) == SOCKET_ERROR) PrintError("Failed POP3 bind() call:"); if(bind(SMTPSocket,&SMTPSAddr,sizeof(struct sockaddr_in)) == SOCKET_ERROR) PrintError("Failed SMTP bind() call:"); if (listen(POP3Socket,cfgParams->numOfThrds) != 0) PrintError("POP3 listen() error"); if (listen(SMTPSocket,cfgParams->numOfThrds) != 0) PrintError("SMTP listen() error"); } /*tArgs è una stuttura dati che contiene i parametri passati al Thread incaricato di gestire le nuove connessioni in arrivo. E' definita nel seguente modo: typedef struct{ int num; int POP3Port; int SMTPPort; int status; // 0 = Free slot, 1 = Thread stopped, 2 = Thread running, 3 = Shutdown request, 4 = Re-read config file SOCKET POP3Socket; SOCKET SMTPSocket; HANDLE srv_thd; } THRD_PARAMS; */ static DWORD WINAPI ThrdConn(THRD_PARAMS *tArgs) { LONG AddrLen, ThId; tArgs->POP3Socket = accept (POP3Socket, (struct sockaddr *)&ConnPOP3SAddr, &AddrLen); if (tArgs->POP3Socket == INVALID_SOCKET) { PrintError("POP3 accept() error:"); } tArgs->SMTPSocket = accept (SMTPSocket, (struct sockaddr *)&ConnSMTPSAddr, &AddrLen); if (tArgs->SMTPSocket == INVALID_SOCKET) { PrintError("SMTP accept() error:"); } tArgs->status = 2; tArgs->srv_thd = (HANDLE)_beginthreadex (NULL, 0, AcceptCommands, tArgs, 0, &ThId); if (tArgs->srv_thd == NULL) PrintError("Failed creating server thread"); return 0; }
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ho risolto il problema creando due thread separati, uno per la connessione POP3 e uno per la connessione SMTP. Grazie lo stesso.
![]()
__________________
Intel Core 2 Duo Q6600 G0, 4GB DDR2-800 A-Data, ABIT AB9, XFX GeForce 8800 GTS 320MB, Sound Blaster X-Fi Extreme Music, Seagate 320GB SATA2, Maxtor 80GB ATA-133, Western Digital 1TB SATA2 Ho concluso affari positivamente con: scandalf, Sinclair63, mstella, checcodag, wilson |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Esattamente, è la cosa migliore. In teoria spesso POP3 e SMTP sono due servizi separati (infatti su una macchina potresti averne uno senza avere l'altro). Ti consiglio di separarli.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:19.