2014-11-30 3 views
1

Я пытаюсь подключиться к почтовому серверу pop3 с использованием TCP, но когда я пытаюсь отправить read() сообщение сразу после connect(), консоль просто зависает.Чтение сообщения из гнезда висит

int sd; 
struct sockaddr_in server; 

if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
    perror ("Error: socket()\n"); 
    return errno; 
} 

server.sin_family = AF_INET; 
server.sin_addr.s_addr = inet_addr(ADDR); 
server.sin_port = htons(PORT); 

if (connect(sd, (struct sockaddr *) &server, sizeof(struct sockaddr)) == -1) { 
    perror("Error: connect()\n"); 
    return errno; 
} 

char message[100]; 
read(sd, message, 100); // <== here it hangs 
printf ("message: %s\n", message); 

close (sd); 

Где ADDR является IP и PORT является порт сервера я пытаюсь подключиться (в моем случае 188.125.69.47 и 995). Из того, что я прочитал в RFC, после connect() я должен получить следующее сообщение:

+OK hello from .... 
+1

Вы подключаетесь к ** POP3s **, который является POP3 через SSL. Сначала вам нужно инициировать SSL-соединение. Сравните 'nc -v 188.125.69.47 995' (ничего там) с' openssl s_client -connect 188.125.69.47: 995' (* + OK привет ... *). – tomasz

ответ

1

Ваше чтение не даст вам ничего, потому что сервер не посылает никаких данных. Вы правы, что на сервере POP3 сначала нужно отправить вам приветствие, но когда вы подключаетесь к POP3 over port 995, сначала необходимо установить сеанс SSL. Однако это требует от клиента начального handshake.

Вам понадобится библиотека, чтобы установить соединение SSL, а затем поговорить в POP3, например OpenSSL.

Ответы в этом вопросе могут быть полезны: How to use POP3 over SSL in C.

+1

Спасибо, я нашел [this] (http://savetheions.com/2010/01/16/quickly-using-openssl-in-c/) пример, как использовать ssl и теперь работает. –

Смежные вопросы