连接失败每次(也越来越非法指令: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?

我对此很新。让我知道你是否需要更多的代码部分。

+1

做perror而不是printf - 你会得到一个错误的解释 – pm100

+0

好吧。感谢那! 我收到文件名太长的错误。 这是什么意思? – Manic

+0

@Myst'htons()'在那里是正确的。请参阅* man *页面。你有没有其他想法的理由? – EJP

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; 
} 

打印自己的错误消息的一个errnoperror()strerror()给你是完全是浪费时间,而不是。不要这样做。每次任何系统调用失败,您必须打印或记录或返回实际错误。

Obviosuly的“非法指令”的问题不能从这个代码的到来,为您打印更多的消息就退出了。

+0

好的。这有效,有点。现在我得到'拒绝连接'。似乎服务器从不执行监听部分,为什么它超出了我的范围。 :( – Manic

+0

我建议你*调试*它,开始在我的第二个,最后一个段落的建议。 – EJP

+0

是的。这样做。非常感谢! 虽然,有这个东西用gdb和Mac,我不知道是否有是适用于MacOS 10.13修复,但我没有离开这个分配足够的时间来试图解决这个问题。因此,试图用每行后打印语句来调试。 哦。这种指派,多客户端聊天应用是我第一次在C.编码:P – Manic