【问题标题】:Why am I having "Invalid argument" while trying to accept connections?为什么在尝试接受连接时出现“无效参数”?
【发布时间】:2011-02-03 21:57:23
【问题描述】:

在下一个代码中,当我尝试连接客户端时,服务器显示以下错误:

“无效参数”,我看不到错误。

if((l_sock=socket(AF_INET,SOCK_STREAM,0))!=-1)
{
    struct sockaddr_in srv_dir;

    srv_dir.sin_family=AF_INET;
    srv_dir.sin_port=8500;
    srv_dir.sin_addr.s_addr=INADDR_ANY;

    if((bind(l_sock,(struct sockaddr *)&srv_dir,sizeof(struct sockaddr_in)))!=-1)
    {
        if(!(listen(l_sock,5)))
        {
            signal(SIGINT,cerraje);
            int t_sock;
            struct sockaddr_in cli_dir;
            socklen_t tam;
            time_t tstmp;
            struct tm * res;
            res=(struct tm *)malloc(sizeof(struct tm));

            while(!key)
            {
                if((t_sock=accept(l_sock,(struct sockaddr *)&cli_dir,&tam))!=-1)
                {
                    tstmp=time(&tstmp);
                    res=gmtime(&tstmp);
                    send(t_sock,res,sizeof(struct tm),0);
                    wr_hora(*res,cli_dir.sin_addr);         
                }
                else
                    perror("Petición no atendida");//The error is printed here.

【问题讨论】:

    标签: c sockets network-programming


    【解决方案1】:

    阅读accept(2)上的文档:

    addrlen 参数是一个值结果参数:它最初应该包含 addr 指向的结构的大小;返回时,它将包含返回地址的实际长度(以字节为单位)。当 addr 为 NULL 时,不填写任何内容。

    所以你需要用sizeof(cli_dir) 初始化传递给accepttam 的值。您很幸运,套接字库能够捕获您的错误,因为您传入了未初始化的内存,这会导致未定义的行为。

    【讨论】:

    • 就是这样,非常感谢。我以为变量 tam 只是一个输出值,所以我什至不认为它需要一个初始值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2011-12-22
    • 2021-01-05
    • 2021-06-06
    • 1970-01-01
    • 2021-09-23
    • 2019-02-04
    相关资源
    最近更新 更多