2011-01-25 29 views
6

Bất kỳ ý tưởng nào khi máy chủ ghi một ổ cắm trong khi máy khách đang chờ chọn, chọn không bao giờ kết thúc?bằng cách chọn để đợi dữ liệu trên ổ cắm ứng dụng khách

Tôi đang sử dụng c để giao tiếp giữa các ổ cắm. Khách hàng của tôi kết nối với máy chủ của tôi tốt.

socket_desc=socket(AF_INET,SOCK_STREAM,0);//create the socket descriptor 
client->address.sin_addr.s_addr = inet_addr(ipAddress); 
client->address.sin_family = AF_INET; 
client->address.sin_port = htons(port); 

bind(socket_desc,&address,sizeof(address)); 
connect(socket_desc, &address, sizeof(address)); 

Khi tôi sử dụng recv để chặn và lắng nghe cho dữ liệu, tất cả mọi thứ hoạt động tốt:

int bytesRead = 1; 
while(bytesRead){ 
    int bufsize=1024;   
    char *buffer=malloc(bufsize); 
    bytesRead = recv(socket_desc, buffer, bufsize, 0); 
    printf("CLIENT RECV: %s", buffer); 
} 

Nếu tôi cố gắng sử dụng lựa chọn, nó dường như không đọc bất kỳ dữ liệu. Nếu tôi thêm STDIN vào fd_set, tôi có thể buộc nó đọc từ socket, nhưng chọn dường như không được kích hoạt từ việc đọc socket_desc trong dữ liệu ...?

int running = 1; 
while(running){ 
    /* wait for something to happen on the socket */ 
    struct timeval selTimeout; 
    selTimeout.tv_sec = 2;  /* timeout (secs.) */ 
    selTimeout.tv_usec = 0;   /* 0 microseconds */ 
    fd_set readSet; 
    FD_ZERO(&readSet); 
    FD_SET(STDIN_FILENO, &readSet);//stdin manually trigger reading 
    FD_SET(socket_desc, &readSet);//tcp socket 

    int numReady = select(3, &readSet, NULL, NULL, &selTimeout); 
      //IT ONLY GETS PAST SELECT ON RETURN FROM THE KEYBOARD 
    if(numReady > 0){ 
     char buffer[100] = {'\0'}; 
     int bytesRead = read(socket_desc, &buffer, sizeof(buffer)); 
     printf("bytesRead %i : %s", bytesRead, buffer); 
     if(bytesRead == 0){ 
      running = FALSE; 
      printf("Shutdowning client.\n"); 

     } 
    } 

Trả lời

8

Tham số đầu tiên để lựa chọn nên là ổ cắm id tối đa cộng với 1. Vì vậy, trong trường hợp của bạn, nó phải là

socket_desc+1 

Bạn có thể thử với điều đó và xem nếu nó hoạt động?

Lý do nó chỉ nhận được khi bạn nhấn một phím trên bàn phím là do stdin là 0, nằm trong khoảng 0 - (3 - 1), đó là những gì được chọn. Nếu bạn đặt tham số đầu tiên là socket_desc + 1, thì cần phải kiểm tra 0 - (socket_desc) cho các ổ cắm sẵn sàng

+1

Cũng như lưu ý, khi chọn trên nhiều ổ cắm, bạn nên kiểm tra xem id socket có được đặt bằng FD_ISSET – vmpstr

+0

không đã làm điều đó. Tôi thấy ngớ ngẩn. FD_ISSET là tiếp theo. – joels

Các vấn đề liên quan