3年前。

This question was migrated from Server Fault because it can be answered on Stack Overflow. Migrated
我试图连接到局域网中的邮件服务器。邮件服务器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.
$

那么,我在这里犯了什么错?我的程序有什么问题吗?我请求你帮助我解决这个问题以及为什么会发生这个问题。

最佳答案

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

sa.sin_port=25;

你需要的是这样的东西:
sa.sin_port = htons(25);

也就是说,端口号的字节顺序是错误的,这意味着它将被完全解释为另一个数字。
来自HTONS(3):
函数的作用是:从
主机字节顺序到网络字节顺序。
[剪]
在i386上,主机字节顺序首先是最低有效字节,
而互联网上使用的网络字节顺序是
先是漂亮的字节。
即使您是在主机字节顺序与网络字节顺序(即,两个msb)匹配的体系结构上开发的,您也希望进行转换以允许可移植性。

10-01 11:18