连接失败每次(也越来越非法指令:4)
问题描述:
int connect_to_host(char* server_ip, char* server_port)
{
printf("%s\n", "in connect to host");
printf("server_ip in connect_to_host: %s\n", server_ip);
printf("server_port in connect_to_host: %s\n", server_port);
struct sockaddr_in remote_server_addr;
int fdsocket, port;
uint16_t port = atoi(server_port);
socklen_t len = sizeof(remote_server_addr);
fdsocket = socket(AF_INET, SOCK_STREAM, 0);
if(fdsocket < 0) {
printf("%s\n", "socket error");
return -1;
}
memset(&remote_server_addr, 0, sizeof(remote_server_addr));
remote_server_addr.sin_family = AF_INET;
remote_server_addr.sin_addr.s_addr = inet_addr(server_ip);
//inet_pton(AF_INET, server_ip, &remote_server_addr.sin_addr);
remote_server_addr.sin_port = htons(port);
printf("remote server port after htons: %d\n", remote_server_addr.sin_port);
if(connect(fdsocket, (struct sockaddr*)&remote_server_addr, &len) < 0) {
printf("%s\n", "connect error");
return -1;
}
return fdsocket;
}
此块的输出:连接失败每次(也越来越非法指令:4)
in connect to host
server_ip in connect_to_host: 192.168.1.179
server_port in connect_to_host: 49200
remote server port after htons: 12480
connect error
[LOGIN:ERROR]
[LOGIN:END]
Illegal instruction: 4
服务器初始化端口49200,它的IP是相同的客户端(在本地机器上测试) - 192.168.1.179。
我不明白为什么连接失败。原因我在一个不同的函数中以相同的方式执行connect(),只是在这种情况下连接是UDP,并且工作正常。是否因为我试图连接到相同的IP?
我对此很新。让我知道你是否需要更多的代码部分。
答
if(connect(fdsocket, (struct sockaddr*)&remote_server_addr, &len) < 0) {
printf("%s\n", "connect error");
return -1;
}
问题在这里。 connect()
的第三个参数是addrlen_t
,而不是指针。它应该是:
if(connect(fdsocket, (struct sockaddr*)&remote_server_addr, len) < 0) {
perror("connect error");
return -1;
}
打印自己的错误消息的一个errno
或perror()
或strerror()
给你是完全是浪费时间,而不是。不要这样做。每次任何系统调用失败,您必须打印或记录或返回实际错误。
Obviosuly的“非法指令”的问题不能从这个代码的到来,为您打印更多的消息就退出了。
做perror而不是printf - 你会得到一个错误的解释 – pm100
好吧。感谢那! 我收到文件名太长的错误。 这是什么意思? – Manic
@Myst'htons()'在那里是正确的。请参阅* man *页面。你有没有其他想法的理由? – EJP