我尝试连接到局域网中的邮件服务器。邮件服务器的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.
$
那么,我在这里做的错误是什么。我的程序有什么问题吗?我请求你帮我解决这个问题及其发生的原因。
答案 0 :(得分:4)
无视任何其他问题,导致问题直接破坏的原因是(几乎可以肯定,除非出现“意外”主机架构):
sa.sin_port=25;
你需要的是这样的东西:
sa.sin_port = htons(25);
即,您的端口号字节顺序错误,这意味着它将被完全解释为其他数字。
从htons(3):
htons()函数转换无符号短整数hostshort 主机字节顺序为网络字节顺序。
[剪断]
在i386上,主机字节顺序首先是最低有效字节, 而互联网上使用的网络字节顺序是大多数信号 - 首先是重要的字节。
即使您在主机字节顺序与网络字节顺序匹配的架构(即两个MSB)上进行开发,您也希望进行转换以实现可移植性。