@@ -68,29 +68,35 @@ int tcp_write(int sock, char* data) {
6868}
6969
7070int tcp_read (int sock , char * data , int size , int timeout_sec ) {
71+ struct timeval tv ;
72+ fd_set receive ;
7173 int n_recv = 0 ;
7274 int n_tmp = 0 ;
73- struct timeval tv ;
74- tv .tv_sec = 0 ;
75- tv .tv_usec = 50000 ;
76- setsockopt (sock , SOL_SOCKET , SO_RCVTIMEO , (char * )& tv ,sizeof (struct timeval ));
7775 int bracketCount = 0 ;
7876 int readCount = 0 ;
79- while (n_recv < size && readCount ++ < timeout_sec * 1000 / 50 ){
80- // need to put select to timeout asap
81- n_tmp = recv (sock , data + n_recv , size - n_recv , 0 );
82- if (n_tmp == -1 ) {
83- n_tmp = 0 ;
84- }
85- // Analyze the data to get the object asap.
86- int i ;
87- for (i = 0 ; i < n_tmp ; i ++ ) {
88- if (data [n_recv + i ] == '{' ) bracketCount ++ ;
89- if (data [n_recv + i ] == '}' ) bracketCount -- ;
90- }
91- n_recv += n_tmp ;
92- if (n_recv > 0 && bracketCount == 0 ) {
93- break ;
77+ while (n_recv < size && readCount ++ < timeout_sec * 10 ) {
78+ FD_ZERO (& receive );
79+ FD_SET (sock , & receive );
80+ tv .tv_sec = 0 ;
81+ tv .tv_usec = 100000 ;
82+ if (select (sock + 1 , & receive , NULL , NULL , & tv ) > 0 ) {
83+ if (FD_ISSET (sock , & receive )) {
84+ // need to put select to timeout asap
85+ n_tmp = recv (sock , data + n_recv , size - n_recv , 0 );
86+ if (n_tmp == -1 ) {
87+ n_tmp = 0 ;
88+ }
89+ // Analyze the data to get the object asap.
90+ int i ;
91+ for (i = 0 ; i < n_tmp ; i ++ ) {
92+ if (data [n_recv + i ] == '{' ) bracketCount ++ ;
93+ if (data [n_recv + i ] == '}' ) bracketCount -- ;
94+ }
95+ n_recv += n_tmp ;
96+ if (n_recv > 0 && bracketCount == 0 ) {
97+ break ;
98+ }
99+ }
94100 }
95101 }
96102 data [n_recv ] = '\0' ;
0 commit comments