100 |
/* Receive a message on the TCP layer */ |
/* Receive a message on the TCP layer */ |
101 |
BOOL tcp_recv(HCONN conn, int length) |
BOOL tcp_recv(HCONN conn, int length) |
102 |
{ |
{ |
103 |
int rcvd; |
int ret, rcvd = 0; |
104 |
|
struct timeval tv; |
105 |
|
fd_set rfds; |
106 |
|
|
107 |
STREAM_SIZE(conn->in, length); |
STREAM_SIZE(conn->in, length); |
108 |
conn->in.end = conn->in.offset = 0; |
conn->in.end = conn->in.offset = 0; |
109 |
|
|
110 |
while (length > 0) |
while (length > 0) |
111 |
{ |
{ |
112 |
rcvd = read(conn->tcp_socket, conn->in.data + conn->in.end, |
ui_process_events(conn->wnd, conn); |
|
length); |
|
113 |
|
|
114 |
if (rcvd <= 0) |
FD_ZERO(&rfds); |
115 |
|
FD_SET(conn->tcp_socket, &rfds); |
116 |
|
tv.tv_sec = 0; |
117 |
|
tv.tv_usec = 100; |
118 |
|
|
119 |
|
ret = select(conn->tcp_socket+1, &rfds, NULL, NULL, &tv); |
120 |
|
|
121 |
|
if (ret) |
122 |
{ |
{ |
123 |
fprintf(stderr, "read: %s\n", strerror(errno)); |
rcvd = read(conn->tcp_socket, conn->in.data |
124 |
return False; |
+ conn->in.end, length); |
|
} |
|
125 |
|
|
126 |
conn->in.end += rcvd; |
if (rcvd <= 0) |
127 |
length -= rcvd; |
{ |
128 |
|
fprintf(stderr, "read: %s\n", |
129 |
|
strerror(errno)); |
130 |
|
return False; |
131 |
|
} |
132 |
|
|
133 |
|
conn->in.end += rcvd; |
134 |
|
length -= rcvd; |
135 |
|
} |
136 |
} |
} |
137 |
|
|
138 |
return True; |
return True; |