Почему у меня появляется «Неверный аргумент» при попытке принять соединения? - PullRequest
0 голосов
/ 04 февраля 2011

В следующем коде, когда я пытаюсь подключить клиента, сервер показывает следующую ошибку:

"неверный аргумент", я не вижу ошибки.

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.

1 Ответ

10 голосов
/ 04 февраля 2011

Прочтите документацию по accept(2):

Аргумент addrlen является аргументом значение-результат: изначально он должен содержать размер структуры, на которую указывает addr ; по возвращении он будет содержать фактическую длину (в байтах) возвращенного адреса. Когда addr равен NULL, ничего не заполняется.

Таким образом, вам нужно инициализировать значение tam, переданное в accept, с помощью sizeof(cli_dir). Вам повезло, что библиотека сокетов смогла отловить вашу ошибку, потому что вы передаете неинициализированную память, что приводит к неопределенному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...