调用connect失败,出现EINVAL

问题描述

在下面的程序中调用window.requestFileSystem(type,size,successCallback[,errorCallback]);时,失败,显示connect为22(errno)。

EINVAL
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>

int main(int argc,char** argv) {
    if(argc != 3) { /* usage */
        fprintf(stderr,"usage: talk address port\n");
        return EXIT_FAILURE;
    }

    char* address = argv[1];
    char* port = argv[2];

    struct addrinfo hints;
    struct addrinfo *servinfo;
    struct addrinfo *clientinfo;

    memset(&hints,sizeof hints);
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;

    int gai_res = getaddrinfo(address,port,&hints,&servinfo);

    if(gai_res) {
        fprintf(stderr,"Failed to resolve remote address: %s\n",gai_strerror(gai_res));
        return EXIT_FAILURE;
    }

    gai_res = getaddrinfo(NULL,&clientinfo);

    if(gai_res) {
        fprintf(stderr,"Failed to resolve local address: %s\n",gai_strerror(gai_res));
        return EXIT_FAILURE;
    }


    int socket_fd = socket(servinfo->ai_family,servinfo->ai_socktype,servinfo->ai_protocol);

    if(socket_fd == -1) {
        fprintf(stderr,"Failed to open socket to remote host: %s\n",strerror(errno));
        freeaddrinfo(servinfo);
        return EXIT_FAILURE;
    }

    int bind_res = bind(socket_fd,clientinfo->ai_addr,clientinfo->ai_addrlen);

    if(bind_res == -1) {
        fprintf(stderr,"Failed to bind to socket: %s\n",strerror(errno));
        freeaddrinfo(servinfo);
        return EXIT_FAILURE;
    }

    int connect_res = connect(socket_fd,servinfo->ai_addr,servinfo->ai_addrlen);

    if(connect_res == -1) {
        fprintf(stderr,"Failed to connect to socket: %s\n",strerror(errno));
        freeaddrinfo(servinfo);
        return EXIT_FAILURE;
    }

    ssize_t bytes_sent = send(socket_fd,"Hello",7,0);

    if(bytes_sent == -1) {
        fprintf(stderr,"Failed to send to remote host: %s\n",strerror(errno));
        freeaddrinfo(servinfo);
        return EXIT_FAILURE;
    }

    printf("Sent message to %s on port %s\n",address,port);

    close(socket_fd);
    freeaddrinfo(servinfo);

    return EXIT_SUCCESS;
}

当我检查GDB中$ gcc talk.c -Wall -Wextra -Wshadow -pedantic -std=gnu99 -g3 -o talk $ ./talk 192.168.0.16 3301 Failed to connect to socket: Invalid argument 的内容时,一切似乎都很好:

servinfo

请注意,在UDP套接字上调用$ gdb talk -q Reading symbols from talk...done. (gdb) b main.c:63 Breakpoint 1 at 0x13fb: file main.c,line 63. (gdb) run 192.168.0.16 3301 Starting program: /home/foo/dev/tmp/talk/talk 192.168.0.16 3301 Breakpoint 1,main (argc=3,argv=0x7fffffffe328) at main.c:63 63 int connect_res = connect(socket_fd,(gdb) p servinfo $1 = (struct addrinfo *) 0x555555559260 (gdb) p *servinfo $2 = {ai_flags = 0,ai_family = 2,ai_socktype = 2,ai_protocol = 17,ai_addrlen = 16,ai_addr = 0x555555559290,ai_canonname = 0x0,ai_next = 0x0} (gdb) p servinfo->ai_addr $3 = (struct sockaddr *) 0x555555559290 (gdb) p *(servinfo->ai_addr) $4 = {sa_family = 2,sa_data = "\f\345\300\250\000\020\000\000\000\000\000\000\000"} 是定义明确的,并且这样做(至少在这种情况下)是为了方便使用connectsend(而不是它们的数据报)同行)。

在这种情况下,recv的哪些参数无效?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...