2010-11-16 130 views
0

我試圖在客戶端向服務器發送文本「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); 



} 

回答

2
read(i, buf,11); 
    buf[11] = '\0'; 

你忽略讀的返回碼()。如果它爲零,則對等體已斷開連接,並且必須關閉該套接字。如果是肯定的,則是接收到的字節數。因此,第二行中的'11'應該是'count'或者是你接收到返回碼的變量。你不能假設你有全部11個字節。

+0

但是,如果我測試0字節,然後關閉套接字,程序將終止,將無法偵聽另一個連接。 – user265767 2010-11-16 23:27:27

+0

關閉* client *套接字,而不是* listen *套接字。 – EJP 2010-11-17 00:24:50

相關問題