Manugal
13-03-2010, 17:14
Ciao a tutti!
Sto programmando un mail server sotto Linux. Nel momento in cui vado a fare la bind() sulla porta 110 mi ritorna l'errore Permission Denied. Leggendo su vari thread ho scoperto che per le porte sotto la 1024 bisogna essere root (però su Windows questo non accade, infatti la bind() funziona normalmente anche sulla porta 110). Ora siccome ho creato un demone per eseguire l'intero mail server, vorrei capire se c'è la possibilità di fare il bind di questa porta (ho letto che bisognerebbe mettere il demone sotto /etc/init.d ma non ho capito bene cosa devo fare).
Edit: Questo è il codice con il quale configuro i socket:
void setMTSocket()
{
#ifdef _WIN32
WSADATA WSStartData;
if(WSAStartup(MAKEWORD (2,2), &WSStartData) != 0)
PrintError("Can't support WinSock v2.2: ");
#endif
struct sockaddr_in POP3SAddr;
memset(&POP3SAddr,0,sizeof(POP3SAddr));
POP3Socket = socket(PF_INET,SOCK_STREAM,0);
if(POP3Socket == INVALID_SOCKET)
PrintError("Failed POP3 socket() call: ");
POP3SAddr.sin_family = AF_INET;
POP3SAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
POP3SAddr.sin_port = htons((uint16_t) cfgParams->POP3Port);
if(bind(POP3Socket,(struct sockaddr *)&POP3SAddr,sizeof(struct sockaddr_in)) == SOCKET_ERROR)
PrintError("Failed POP3 bind() call: ");
if (listen(POP3Socket,cfgParams->numOfThrds) != 0)
PrintError("Failed POP3 listen() call: ");
struct sockaddr_in SMTPSAddr;
memset(&SMTPSAddr,0,sizeof(SMTPSAddr));
SMTPSocket = socket(PF_INET,SOCK_STREAM,0);
if(SMTPSocket == INVALID_SOCKET)
PrintError("Failed SMTP socket() call: ");
SMTPSAddr.sin_family = AF_INET;
SMTPSAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
SMTPSAddr.sin_port = htons((uint16_t) cfgParams->SMTPPort);
if(bind(SMTPSocket,(struct sockaddr *)&SMTPSAddr,sizeof(struct sockaddr_in)) == SOCKET_ERROR)
PrintError("Failed SMTP bind() call: ");
if(listen(SMTPSocket,cfgParams->numOfThrds) != 0)
PrintError("Failed SMTP listen() call: ");
return;
}
Sto programmando un mail server sotto Linux. Nel momento in cui vado a fare la bind() sulla porta 110 mi ritorna l'errore Permission Denied. Leggendo su vari thread ho scoperto che per le porte sotto la 1024 bisogna essere root (però su Windows questo non accade, infatti la bind() funziona normalmente anche sulla porta 110). Ora siccome ho creato un demone per eseguire l'intero mail server, vorrei capire se c'è la possibilità di fare il bind di questa porta (ho letto che bisognerebbe mettere il demone sotto /etc/init.d ma non ho capito bene cosa devo fare).
Edit: Questo è il codice con il quale configuro i socket:
void setMTSocket()
{
#ifdef _WIN32
WSADATA WSStartData;
if(WSAStartup(MAKEWORD (2,2), &WSStartData) != 0)
PrintError("Can't support WinSock v2.2: ");
#endif
struct sockaddr_in POP3SAddr;
memset(&POP3SAddr,0,sizeof(POP3SAddr));
POP3Socket = socket(PF_INET,SOCK_STREAM,0);
if(POP3Socket == INVALID_SOCKET)
PrintError("Failed POP3 socket() call: ");
POP3SAddr.sin_family = AF_INET;
POP3SAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
POP3SAddr.sin_port = htons((uint16_t) cfgParams->POP3Port);
if(bind(POP3Socket,(struct sockaddr *)&POP3SAddr,sizeof(struct sockaddr_in)) == SOCKET_ERROR)
PrintError("Failed POP3 bind() call: ");
if (listen(POP3Socket,cfgParams->numOfThrds) != 0)
PrintError("Failed POP3 listen() call: ");
struct sockaddr_in SMTPSAddr;
memset(&SMTPSAddr,0,sizeof(SMTPSAddr));
SMTPSocket = socket(PF_INET,SOCK_STREAM,0);
if(SMTPSocket == INVALID_SOCKET)
PrintError("Failed SMTP socket() call: ");
SMTPSAddr.sin_family = AF_INET;
SMTPSAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
SMTPSAddr.sin_port = htons((uint16_t) cfgParams->SMTPPort);
if(bind(SMTPSocket,(struct sockaddr *)&SMTPSAddr,sizeof(struct sockaddr_in)) == SOCKET_ERROR)
PrintError("Failed SMTP bind() call: ");
if(listen(SMTPSocket,cfgParams->numOfThrds) != 0)
PrintError("Failed SMTP listen() call: ");
return;
}