Сервер странный после отключения клиента - PullRequest
0 голосов
/ 17 ноября 2010

Я пытаюсь создать серверную / клиентскую программу, в которой клиент отправляет на сервер текст «Hello World», затем сервер печатает текст в терминал.

После того, как клиентская программа завершает работу, сервер сходит с ума и продолжает печатать «Hello World», пока я не завершу работу сервера с помощью Ctrl - C. Может кто-нибудь помочь мне понять, почему?

selectserver.c

#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h> 
#include <stdio.h>
#include <string.h> 


main()
{
    struct sockaddr_in serveraddr, clientaddr; 
    int clientaddrlen;
    int request_sock, sock[2], numsocks, maxsocks;
    char buf[12]; 
    int i, rc;
    fd_set fds, readfds;
    struct timeval timeout;

    numsocks = 0; maxsocks = 2;

    timeout.tv_sec = 5;
    timeout.tv_usec = 0;


    request_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    bzero((void *) &serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET; 
    serveraddr.sin_addr.s_addr = INADDR_ANY;
    serveraddr.sin_port = htons(2009);

    bind(request_sock, (struct sockaddr *)&serveraddr, sizeof serveraddr);

    listen(request_sock, SOMAXCONN);


    FD_ZERO(&fds);
    FD_SET(request_sock, &fds);


    for (;;) {
        readfds=fds;
        rc=select (FD_SETSIZE, &readfds, NULL, NULL, &timeout);
        if (rc<0)
            return -1;

        for (i = 0; i < FD_SETSIZE; i++)
            if (FD_ISSET (i, &readfds)) {
                if (i == request_sock) {
                    if(numsocks < maxsocks) {

                        sock[numsocks] = accept(request_sock,(struct sockaddr *)&clientaddr, (socklen_t *)&clientaddrlen);

                        FD_SET(sock[numsocks], &fds);
                        numsocks++;
                    } else {
                        printf("Ran out of space for sockets.\n");
                        return -1;
                    }
                } else {


                    read(i, buf,11);
                    buf[11] = '\0';
                    printf("From socket %d: %s\n",i,buf);

                }


            }

    } 

    close(request_sock);
}

selectclient.c

#include <netinet/in.h> 

#include <sys/socket.h>

#include <netdb.h> 

#include <stdio.h>

#include <string.h> 

#include <unistd.h>



main(int argc, char *argv[])

{



     struct sockaddr_in serveraddr;

     int sock;

     char buf[12]; 

    int i;





    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);





    bzero((void *) &serveraddr, sizeof(serveraddr));





    serveraddr.sin_family = AF_INET;



    serveraddr.sin_addr.s_addr = inet_addr("192.168.1.3");





    serveraddr.sin_port = htons(2009);





    connect(sock, (struct sockaddr *)&serveraddr, sizeof serveraddr); 





    for(i=0; i<10; i++) {

        write(sock, "Hello World", 11);

        sleep(1);

    }



    close(sock);



}

1 Ответ

2 голосов
/ 17 ноября 2010
   read(i, buf,11);
   buf[11] = '\0';

Вы игнорируете код возврата read ().Если он равен нулю, одноранговый узел отключился, и вы должны закрыть сокет.Если оно положительное, это число полученных байтов.Таким образом, '11' во второй строке должно быть 'count' или любой другой переменной, в которую вы получили код возврата.Вы не можете предполагать, что получили все 11 байтов.

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