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