如何在C中连接到邮件服务器

时间:2016-02-06 09:55:37

标签: linux smtp mail-server unix sendmail

我尝试连接到局域网中的邮件服务器。邮件服务器的IP是192.168.1.1。所以,我试过了 以下程序来测试。

程序:

#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,它已成功连接,如下所示。

$ 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.
$

那么,我在这里做的错误是什么。我的程序有什么问题吗?我请求你帮我解决这个问题及其发生的原因。

1 个答案:

答案 0 :(得分:4)

无视任何其他问题,导致问题直接破坏的原因是(几乎可以肯定,除非出现“意外”主机架构):

sa.sin_port=25;

你需要的是这样的东西:

sa.sin_port = htons(25);

即,您的端口号字节顺序错误,这意味着它将被完全解释为其他数字。

从htons(3):

  

htons()函数转换无符号短整数hostshort     主机字节顺序为网络字节顺序。

     

[剪断]

     

在i386上,主机字节顺序首先是最低有效字节,      而互联网上使用的网络字节顺序是大多数信号 -      首先是重要的字节。


即使您在主机字节顺序与网络字节顺序匹配的架构(即两个MSB)上进行开发,您也希望进行转换以实现可移植性。