Почему TCP-сервер получает поврежденные сообщения? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь настроить хостинг TCP / UDP-сервера на том же порту.

UDP-часть работает нормально, но TCP-часть не получает сообщения должным образом.

Я пытался протестироватьэто с Netcat, например.когда я посылаю «TCP yu do dis», он выводит что-то вроде «D (») и продолжает вращаться в цикле do while.

    //Creating TCP listen socket
    tcp_listenfd=socket(AF_INET, SOCK_STREAM, 0);
    bzero(&tcp_servaddr, sizeof(tcp_servaddr));
    tcp_servaddr.sin_family=AF_INET;
    tcp_servaddr.sin_port=htons(atoi(tcp_port));
    tcp_servaddr.sin_addr.s_addr=htonl(INADDR_ANY);

    //Binding TCP socket
    setsockopt(tcp_listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    bind(tcp_listenfd,(struct sockaddr*)&tcp_servaddr,sizeof(tcp_servaddr));
    listen(tcp_listenfd, 10);

    //Creating UDP listen socket
    udp_listenfd=socket(AF_INET, SOCK_DGRAM, 0);
    bzero(&udp_servaddr, sizeof(udp_servaddr));
    udp_servaddr.sin_family=AF_INET;
    udp_servaddr.sin_port=htons(atoi(udp_port));
    udp_servaddr.sin_addr.s_addr=htonl(INADDR_ANY);

    //Binding UDP listen socket
    bind(udp_listenfd, (struct sockaddr*)&udp_servaddr, sizeof(udp_servaddr));

    //Clear descriptor set
    FD_ZERO(&rset);

    //Max file descriptor
    maxfd = max(tcp_listenfd, udp_listenfd)+1;

    while(1){
        // set listenfd and udpfd in readset
        FD_SET(tcp_listenfd, &rset);
        FD_SET(udp_listenfd, &rset);

        nready = select(maxfd, &rset, NULL, NULL, NULL);

        if (FD_ISSET(tcp_listenfd, &rset)) {
            printf("TCP ready!\n");
            len=sizeof(cli_addr);
            connfd = accept(tcp_listenfd, (struct sockaddr*)&cli_addr, &len);
            do {
                numbytes=recv(tcp_listenfd, tcp_buff, sizeof(tcp_buff), 0);
                printf("Received message: %s\n", tcp_buff);
            }while(strcmp(tcp_buff, "HELLO\n")!=0);
            send(tcp_listenfd, payload, strlen(payload)+1, 0);
            close(connfd);
            bzero(&cli_addr, sizeof(cli_addr));
        }

        if(FD_ISSET(udp_listenfd, &rset)){
            printf("UDP ready!\n");
            len=sizeof(cli_addr);
            do{
                recvfrom(udp_listenfd, udp_buff, 1024, 0,(struct sockaddr *)&cli_addr, &len);
            }while(strcmp(udp_buff, "HELLO\n")!=0);
            sendto(udp_listenfd, payload, strlen(payload)+1, 0, (struct sockaddr *)&cli_addr, len);
            close(udp_listenfd);
            bzero(&cli_addr, sizeof(cli_addr));
        }
    }

1 Ответ

1 голос
/ 14 мая 2019

Хорошо, проблема здесь:

 connfd = accept(tcp_listenfd, (struct sockaddr*)&cli_addr, &len);
 do {
    numbytes=recv(tcp_listenfd, tcp_buff, sizeof(tcp_buff), 0);

В вашем recv() звонке вы набираете tcp_listenfd, когда вместо этого вы должны набирать connfd. (Также вы должны проверить возвращаемые значения всех вызовов функции, чтобы убедиться, что функция выполнена успешно, и предпринять соответствующие действия (например, распечатать сообщение об ошибке через perror()), если вызовы функции не выполнены. См. Страницу руководства для каждой функции подробности о том, что возвращаемые значения составляют успех против отказа для этой функции)

...