@@ -189,13 +189,31 @@ int win32_connect(SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen)
189
189
}
190
190
191
191
int win32_getsockopt (SOCKET sockfd , int level , int optname , void * optval , socklen_t * optlen ) {
192
- int ret = getsockopt (sockfd , level , optname , (char * )optval , optlen );
192
+ int ret = 0 ;
193
+ if ((level == SOL_SOCKET ) && ((optname == SO_RCVTIMEO ) || (optname == SO_SNDTIMEO ))) {
194
+ struct timeval * tv = (struct timeval * )optval ;
195
+ DWORD timeout = 0 ;
196
+ socklen_t dwlen = 0 ;
197
+ ret = getsockopt (sockfd , level , optname , (char * )timeout , & dwlen );
198
+ tv -> tv_sec = timeout / 1000 ;
199
+ tv -> tv_usec = timeout * 1000 ;
200
+ * optlen = sizeof (struct timeval );
201
+ } else {
202
+ ret = getsockopt (sockfd , level , optname , (char * )optval , optlen );
203
+ }
193
204
_updateErrno (ret != SOCKET_ERROR );
194
205
return ret != SOCKET_ERROR ? ret : -1 ;
195
206
}
196
207
197
208
int win32_setsockopt (SOCKET sockfd , int level , int optname , const void * optval , socklen_t optlen ) {
198
- int ret = setsockopt (sockfd , level , optname , (const char * )optval , optlen );
209
+ int ret = 0 ;
210
+ if ((level == SOL_SOCKET ) && ((optname == SO_RCVTIMEO ) || (optname == SO_SNDTIMEO ))) {
211
+ struct timeval * tv = (struct timeval * )optval ;
212
+ DWORD timeout = tv -> tv_sec * 1000 + tv -> tv_usec / 1000 ;
213
+ ret = setsockopt (sockfd , level , optname , (const char * )& timeout , sizeof (DWORD ));
214
+ } else {
215
+ ret = setsockopt (sockfd , level , optname , (const char * )optval , optlen );
216
+ }
199
217
_updateErrno (ret != SOCKET_ERROR );
200
218
return ret != SOCKET_ERROR ? ret : -1 ;
201
219
}
0 commit comments