PDA

View Full Version : [C] Ascoltare connessione su più porte


Manugal
10-02-2010, 19:08
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:

//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;
}


Non capisco dov'è che sbaglio.

Manugal
10-02-2010, 19:52
Ho risolto il problema creando due thread separati, uno per la connessione POP3 e uno per la connessione SMTP. Grazie lo stesso. ;)

cionci
11-02-2010, 08:42
Ho risolto il problema creando due thread separati, uno per la connessione POP3 e uno per la connessione SMTP. Grazie lo stesso. ;)
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.