OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #include "webrtc/base/physicalsocketserver.h" | 10 #include "webrtc/base/physicalsocketserver.h" |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 return -1; | 264 return -1; |
265 if (opt == OPT_DONTFRAGMENT) { | 265 if (opt == OPT_DONTFRAGMENT) { |
266 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 266 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
267 value = (value) ? IP_PMTUDISC_DO : IP_PMTUDISC_DONT; | 267 value = (value) ? IP_PMTUDISC_DO : IP_PMTUDISC_DONT; |
268 #endif | 268 #endif |
269 } | 269 } |
270 return ::setsockopt(s_, slevel, sopt, (SockOptArg)&value, sizeof(value)); | 270 return ::setsockopt(s_, slevel, sopt, (SockOptArg)&value, sizeof(value)); |
271 } | 271 } |
272 | 272 |
273 int PhysicalSocket::Send(const void* pv, size_t cb) { | 273 int PhysicalSocket::Send(const void* pv, size_t cb) { |
274 int sent = ::send(s_, reinterpret_cast<const char *>(pv), (int)cb, | 274 int sent = DoSend(s_, reinterpret_cast<const char *>(pv), |
| 275 static_cast<int>(cb), |
275 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 276 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
276 // Suppress SIGPIPE. Without this, attempting to send on a socket whose | 277 // Suppress SIGPIPE. Without this, attempting to send on a socket whose |
277 // other end is closed will result in a SIGPIPE signal being raised to | 278 // other end is closed will result in a SIGPIPE signal being raised to |
278 // our process, which by default will terminate the process, which we | 279 // our process, which by default will terminate the process, which we |
279 // don't want. By specifying this flag, we'll just get the error EPIPE | 280 // don't want. By specifying this flag, we'll just get the error EPIPE |
280 // instead and can handle the error gracefully. | 281 // instead and can handle the error gracefully. |
281 MSG_NOSIGNAL | 282 MSG_NOSIGNAL |
282 #else | 283 #else |
283 0 | 284 0 |
284 #endif | 285 #endif |
285 ); | 286 ); |
286 UpdateLastError(); | 287 UpdateLastError(); |
287 MaybeRemapSendError(); | 288 MaybeRemapSendError(); |
288 // We have seen minidumps where this may be false. | 289 // We have seen minidumps where this may be false. |
289 ASSERT(sent <= static_cast<int>(cb)); | 290 ASSERT(sent <= static_cast<int>(cb)); |
290 if ((sent < 0) && IsBlockingError(GetError())) { | 291 if ((sent > 0 && sent < static_cast<int>(cb)) || |
| 292 (sent < 0 && IsBlockingError(GetError()))) { |
291 enabled_events_ |= DE_WRITE; | 293 enabled_events_ |= DE_WRITE; |
292 } | 294 } |
293 return sent; | 295 return sent; |
294 } | 296 } |
295 | 297 |
296 int PhysicalSocket::SendTo(const void* buffer, | 298 int PhysicalSocket::SendTo(const void* buffer, |
297 size_t length, | 299 size_t length, |
298 const SocketAddress& addr) { | 300 const SocketAddress& addr) { |
299 sockaddr_storage saddr; | 301 sockaddr_storage saddr; |
300 size_t len = addr.ToSockAddrStorage(&saddr); | 302 size_t len = addr.ToSockAddrStorage(&saddr); |
301 int sent = ::sendto( | 303 int sent = DoSendTo( |
302 s_, static_cast<const char *>(buffer), static_cast<int>(length), | 304 s_, static_cast<const char *>(buffer), static_cast<int>(length), |
303 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 305 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
304 // Suppress SIGPIPE. See above for explanation. | 306 // Suppress SIGPIPE. See above for explanation. |
305 MSG_NOSIGNAL, | 307 MSG_NOSIGNAL, |
306 #else | 308 #else |
307 0, | 309 0, |
308 #endif | 310 #endif |
309 reinterpret_cast<sockaddr*>(&saddr), static_cast<int>(len)); | 311 reinterpret_cast<sockaddr*>(&saddr), static_cast<int>(len)); |
310 UpdateLastError(); | 312 UpdateLastError(); |
311 MaybeRemapSendError(); | 313 MaybeRemapSendError(); |
312 // We have seen minidumps where this may be false. | 314 // We have seen minidumps where this may be false. |
313 ASSERT(sent <= static_cast<int>(length)); | 315 ASSERT(sent <= static_cast<int>(length)); |
314 if ((sent < 0) && IsBlockingError(GetError())) { | 316 if ((sent > 0 && sent < static_cast<int>(length)) || |
| 317 (sent < 0 && IsBlockingError(GetError()))) { |
315 enabled_events_ |= DE_WRITE; | 318 enabled_events_ |= DE_WRITE; |
316 } | 319 } |
317 return sent; | 320 return sent; |
318 } | 321 } |
319 | 322 |
320 int PhysicalSocket::Recv(void* buffer, size_t length) { | 323 int PhysicalSocket::Recv(void* buffer, size_t length) { |
321 int received = ::recv(s_, static_cast<char*>(buffer), | 324 int received = ::recv(s_, static_cast<char*>(buffer), |
322 static_cast<int>(length), 0); | 325 static_cast<int>(length), 0); |
323 if ((received == 0) && (length != 0)) { | 326 if ((received == 0) && (length != 0)) { |
324 // Note: on graceful shutdown, recv can return 0. In this case, we | 327 // Note: on graceful shutdown, recv can return 0. In this case, we |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 ASSERT((0 <= value) && (value <= 65536)); | 470 ASSERT((0 <= value) && (value <= 65536)); |
468 *mtu = value; | 471 *mtu = value; |
469 return 0; | 472 return 0; |
470 #elif defined(__native_client__) | 473 #elif defined(__native_client__) |
471 // Most socket operations, including this, will fail in NaCl's sandbox. | 474 // Most socket operations, including this, will fail in NaCl's sandbox. |
472 error_ = EACCES; | 475 error_ = EACCES; |
473 return -1; | 476 return -1; |
474 #endif | 477 #endif |
475 } | 478 } |
476 | 479 |
477 | |
478 SOCKET PhysicalSocket::DoAccept(SOCKET socket, | 480 SOCKET PhysicalSocket::DoAccept(SOCKET socket, |
479 sockaddr* addr, | 481 sockaddr* addr, |
480 socklen_t* addrlen) { | 482 socklen_t* addrlen) { |
481 return ::accept(socket, addr, addrlen); | 483 return ::accept(socket, addr, addrlen); |
482 } | 484 } |
483 | 485 |
| 486 int PhysicalSocket::DoSend(SOCKET socket, const char* buf, int len, int flags) { |
| 487 return ::send(socket, buf, len, flags); |
| 488 } |
| 489 |
| 490 int PhysicalSocket::DoSendTo(SOCKET socket, |
| 491 const char* buf, |
| 492 int len, |
| 493 int flags, |
| 494 const struct sockaddr* dest_addr, |
| 495 socklen_t addrlen) { |
| 496 return ::sendto(socket, buf, len, flags, dest_addr, addrlen); |
| 497 } |
| 498 |
484 void PhysicalSocket::OnResolveResult(AsyncResolverInterface* resolver) { | 499 void PhysicalSocket::OnResolveResult(AsyncResolverInterface* resolver) { |
485 if (resolver != resolver_) { | 500 if (resolver != resolver_) { |
486 return; | 501 return; |
487 } | 502 } |
488 | 503 |
489 int error = resolver_->GetError(); | 504 int error = resolver_->GetError(); |
490 if (error == 0) { | 505 if (error == 0) { |
491 error = DoConnect(resolver_->address()); | 506 error = DoConnect(resolver_->address()); |
492 } else { | 507 } else { |
493 Close(); | 508 Close(); |
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1608 break; | 1623 break; |
1609 } | 1624 } |
1610 } | 1625 } |
1611 | 1626 |
1612 // Done | 1627 // Done |
1613 return true; | 1628 return true; |
1614 } | 1629 } |
1615 #endif // WEBRTC_WIN | 1630 #endif // WEBRTC_WIN |
1616 | 1631 |
1617 } // namespace rtc | 1632 } // namespace rtc |
OLD | NEW |