2012-03-23 39 views
6

Sử dụng ổ cắm, tôi không biết cách đặt thời gian chờ?Đặt thời gian chờ của ổ cắm?

nhờ

int sock, connected, bytes_recieved; 
char send_data [128] , recv_data[128];  
SOCKADDR_IN server_addr,client_addr;  
int sin_size; 
int j = 0; 

::socket(AF_INET, SOCK_STREAM, 0); 

server_addr.sin_family = AF_INET;   
server_addr.sin_port = htons(4000);  
server_addr.sin_addr.s_addr = INADDR_ANY; 

::bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); 
::listen(sock, 5); 
::fflush(stdout); 

while(1) 
{ 
    sin_size = sizeof(struct sockaddr_in); 
    connected = ::accept(sock, (struct sockaddr *)&client_addr, &sin_size); 

    while (1) 
    { 
     j++; 

     ::send(connected, send_data, strlen(send_data), 0); 

     //dealing with lost communication ? 
     //and reastablishing communication 
     //set timeout and reset on timeout error  
    } 
} 
::closesocket(sock); 

Trả lời

5

Ổ cắm đang ở chế độ chặn theo mặc định. Nếu bạn chuyển nó sang chế độ non-blocking sử dụng ioctlsocket(FIONBIO), bạn có thể sử dụng để quản lý select() timeout:

SOCKET sock, connected; 
int bytes_recieved; 
char send_data [128] , recv_data[128];   
SOCKADDR_IN server_addr,client_addr;  
int sin_size; 
int j = 0, ret; 
fd_set fd; 
timeval tv; 

sock = ::socket(AF_INET, SOCK_STREAM, 0); 

server_addr.sin_family = AF_INET;   
server_addr.sin_port = htons(4000);  
server_addr.sin_addr.s_addr = INADDR_ANY; 

::bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); 
::listen(sock, 1); 
::fflush(stdout); 

u_long nbio = 1; 
::ioctlsocket(sock, FIONBIO, &nbio); 

while(1) 
{ 
    FD_ZERO(&fd); 
    FD_SET(sock, &fd); 

    tv.tv_sec = 5; 
    tv.tv_usec = 0; 

    if (select(0, &fd, NULL, NULL, &tv) > 0) 
    { 
     sin_size = sizeof(struct sockaddr_in); 
     connected = ::accept(sock, (struct sockaddr *)&client_addr, &sin_size); 

     nbio = 1; 
     ::ioctlsocket(connected, FIONBIO, &nbio); 

     while (1) 
     { 
      j++; 

      if (::send(connected, send_data, strlen(send_data), 0) < 0) 
      { 
       //dealing with lost communication ? 
       //and reastablishing communication 
       //set timeout and reset on timeout error  

       if (WSAGetLastError() == WSAEWOULDBLOCK) 
       { 
        FD_ZERO(&fd); 
        FD_SET(connected, &fd); 

        tv.tv_sec = 5; 
        tv.tv_usec = 0; 

        if (select(0, NULL, &fd, NULL, &tv) > 0) 
         continue; 
       } 

       break; 
      } 
     } 

     closesocket(connected); 
    } 
} 
+0

câu hỏi: chọn (0, NULL, & set, NULL, & tv) trong đó "set" là "int" nhưng đối với "fd_set" nó muốn ... SOCKET fd_array [FD_SETSIZE];/* một mảng SOCKETs */Tôi không sử dụng loại đó nên làm thế nào để tôi có được điều này? thx – jdl

+0

Xin lỗi, xấu của tôi. Tôi sửa nó rồi. –

5

Bạn cần phải sử dụng setsockopt để thiết lập các tùy chọn SO_SNDTIMEO và/hoặc SO_RCVTIMEO.

1

bạn có thể sử dụng:

fd_set fd; 
timeval tv; 
FD_ZERO(&fd); 
FD_SET(sock, &fd); 
tv.tv_sec = time_out(second); 
tv.tv_usec = 0; 

để thiết lập thời gian chờ cho việc gửi, nhận dữ liệu.

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