2016-02-06 5 views
0

Я попытался установить соединение с моим почтовым сервером, который находится в локальной сети. IP-адрес почтового сервера - 192.168.1.1. Итак, я попробовал следующую программу, чтобы проверить это.Как подключиться к почтовому серверу в C

Программа:

#include<stdio.h> 
#include<stdlib.h> 
#include<sys/types.h> 
#include<sys/socket.h> 
#include<arpa/inet.h> 
int main() 
{ 
    struct sockaddr_in sa; 
    struct in_addr ip; 

    int fd=socket(AF_INET,SOCK_STREAM,0); 

    if(inet_pton(AF_INET,"192.168.1.1",&ip)==-1){ 
     printf("Unable to convert ip to binary\n"); 
     perror(""); 
     exit(1); 
    } 

    sa.sin_family=AF_INET; 
    sa.sin_port=25; 
    sa.sin_addr=ip; 

    if(connect(fd,(struct sockaddr*)&sa,sizeof(sa))==-1){ 
     printf("Unable to connect to server\n"); 
     perror(""); 
     exit(1); 
    } 
    else{ 
     printf("Successfully connected to server...\n"); 
    } 
} 

Выход:

$ ./a.out 
Unable to connect to server 
Connection refused 
$ 

Но через телнет, успешно подключен, как показано ниже.

$ telnet 192.168.1.1 25 
Trying 192.168.1.1... 
Connected to 192.168.1.1. 
Escape character is '^]'. 
220 mail.msys.co.in ESMTP Postfix (Debian/GNU) 
^] 
telnet> Connection closed. 
$ 

Итак, что я совершил здесь. Что-то не так в моей программе. Я прошу вас помочь мне решить эту проблему и почему это происходит.

+0

Возможный дубликат [Как подключиться к почтовому серверу в C] (http://stackoverflow.com/questions/35239576/how-to-connect-to-mail-server-in-c) –

+0

Просьба не делать этого перекрестная почта снова, к сайтам вне темы. –

ответ

4

Игнорируя любые другие проблемы, что вызывает прямое повреждение в вопросе (почти наверняка, если не считать «неожиданным» хозяин архитектуры):

sa.sin_port=25; 

Что вам нужно что-то вроде этого:

sa.sin_port = htons(25); 

Т.е. у вас неправильный порядок байтов для номера порта, то есть он будет интерпретироваться как какой-то другой номер целиком.

От htons (3):

Функция htons() преобразует беззнаковое короткое целое hostshort от порядка байтов хоста в сетевой порядок байт.

[надрез]

На i386 хост байты порядка являются младшими байтами первым, в то время как сетевого порядок байт, используемый в Интернете, являются самым SIG- щественны Байтами первым.


Даже если вы разрабатывали на архитектуре, где порядок байт хоста согласованной сетевой порядок байт (т.е. как MSB), вы хотите сделать преобразование, чтобы для портативности.

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