【问题标题】:How to connect to mail server in C如何在C中连接到邮件服务器
【发布时间】:2016-05-16 10:04:14
【问题描述】:

我尝试连接到局域网中的邮件服务器。邮件服务器的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.
$

那么,我在这里犯了什么错误。我的程序有什么问题吗。我请求您帮助我解决这个问题以及它发生的原因。

【问题讨论】:

标签: linux smtp mail-server unix sendmail


【解决方案1】:

忽略任何其他问题,导致问题直接中断的原因是(几乎可以肯定,除非“意外”主机架构):

sa.sin_port=25;

你需要的是这样的:

sa.sin_port = htons(25);

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

来自 htons(3):

htons() 函数将无符号短整型 hostshort 从 主机字节序到网络字节序。

[剪辑]

在 i386 上,主机字节顺序是最低有效字节在前, 而在 Internet 上使用的网络字节顺序是最重要的 字节优先。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2023-03-03
    • 1970-01-01
    • 2014-06-19
    • 2016-05-20
    • 1970-01-01
    相关资源
    最近更新 更多