winsock.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:9k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * winsock.c: POSIX replacements for Winsock
  3.  *****************************************************************************
  4.  * Copyright © 2006-2008 Rémi Denis-Courmont
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  19.  *****************************************************************************/
  20. #ifdef HAVE_CONFIG_H
  21. # include "config.h"
  22. #endif
  23. #include <vlc_common.h>
  24. #include <errno.h>
  25. #include <vlc_network.h>
  26. #ifndef WSA_QOS_EUNKNOWNPSOBJ
  27. # define WSA_QOS_EUNKNOWNPSOBJ 11024L
  28. #endif
  29. typedef struct
  30. {
  31.     int code;
  32.     const char *msg;
  33. } wsaerrmsg_t;
  34. static const wsaerrmsg_t wsaerrmsg[] =
  35. {
  36.     { WSA_INVALID_HANDLE, "Specified event object handle is invalid" },
  37.     { WSA_NOT_ENOUGH_MEMORY, "Insufficient memory available" },
  38.     { WSA_INVALID_PARAMETER, "One or more parameters are invalid" },
  39.     { WSA_OPERATION_ABORTED, "Overlapped operation aborted" },
  40.     { WSA_IO_INCOMPLETE, "Overlapped I/O event object not in signaled state" },
  41.     { WSA_IO_PENDING, "Overlapped operations will complete later" },
  42.     { WSAEINTR, "Interrupted function call" },
  43.     { WSAEBADF, "File handle is not valid" },
  44.     { WSAEACCES, "Access denied" },
  45.     { WSAEFAULT, "Invalid memory address" },
  46.     { WSAEINVAL, "Invalid argument" },
  47.     { WSAEMFILE, "Too many open sockets" },
  48.     { WSAEWOULDBLOCK, "Resource temporarily unavailable" },
  49.     { WSAEINPROGRESS, "Operation now in progress" },
  50.     { WSAEALREADY, "Operation already in progress" },
  51.     { WSAENOTSOCK, "Non-socket handle specified" },
  52.     { WSAEDESTADDRREQ, "Missing destination address" },
  53.     { WSAEMSGSIZE, "Message too long" },
  54.     { WSAEPROTOTYPE, "Protocol wrong type for socket", },
  55.     { WSAENOPROTOOPT, "Option not supported by protocol" },
  56.     { WSAEPROTONOSUPPORT, "Protocol not supported" },
  57.     { WSAESOCKTNOSUPPORT, "Socket type not supported" },
  58.     { WSAEOPNOTSUPP, "Operation not supported" },
  59.     { WSAEPFNOSUPPORT, "Protocol family not supported" },
  60.     { WSAEAFNOSUPPORT, "Address family not supported by protocol family" },
  61.     { WSAEADDRINUSE, "Address already in use" },
  62.     { WSAEADDRNOTAVAIL, "Cannot assign requested address" },
  63.     { WSAENETDOWN, "Network is down" },
  64.     { WSAENETUNREACH, "Network unreachable" },
  65.     { WSAENETRESET, "Network dropped connection on reset" },
  66.     { WSAECONNABORTED, "Software caused connection abort" },
  67.     { WSAECONNRESET, "Connection reset by peer" },
  68.     { WSAENOBUFS, "No buffer space available (not enough memory)" },
  69.     { WSAEISCONN, "Socket is already connected" },
  70.     { WSAENOTCONN, "Socket is not connected" },
  71.     { WSAESHUTDOWN, "Cannot send after socket shutdown" },
  72.     { WSAETOOMANYREFS, "Too many references" },
  73.     { WSAETIMEDOUT, "Connection timed out" },
  74.     { WSAECONNREFUSED, "Connection refused by peer" },
  75.     { WSAELOOP, "Cannot translate name" },
  76.     { WSAENAMETOOLONG, "Name too long" },
  77.     { WSAEHOSTDOWN, "Remote host is down" },
  78.     { WSAEHOSTUNREACH, "No route to host (unreachable)" },
  79.     { WSAENOTEMPTY, "Directory not empty" },
  80.     { WSAEPROCLIM, "Too many processes" },
  81.     { WSAEUSERS, "User quota exceeded" },
  82.     { WSAEDQUOT, "Disk quota exceeded" },
  83.     { WSAESTALE, "Stale file handle reference" },
  84.     { WSAEREMOTE, "Item is remote", },
  85.     { WSASYSNOTREADY, "Network subsystem is unavailable (network stack not ready)" },
  86.     { WSAVERNOTSUPPORTED, "Winsock.dll version out of range (network stack version not supported" },
  87.     { WSANOTINITIALISED, "Network not initialized" },
  88.     { WSAEDISCON, "Graceful shutdown in progress" },
  89.     { WSAENOMORE, "No more results" },
  90.     { WSAECANCELLED, "Call has been cancelled" },
  91.     { WSAEINVALIDPROCTABLE, "Procedure call table is invalid" },
  92.     { WSAEINVALIDPROVIDER, "Service provider is invalid" },
  93.     { WSAEPROVIDERFAILEDINIT, "Service provider failed to initialize" },
  94.     { WSASYSCALLFAILURE, "System call failure" },
  95.     { WSASERVICE_NOT_FOUND, "Service not found" },
  96.     { WSATYPE_NOT_FOUND, "Class type not found" },
  97.     { WSA_E_NO_MORE, "No more results" },
  98.     { WSA_E_CANCELLED, "Call was cancelled" },
  99.     { WSAEREFUSED, "Database query was refused" },
  100.     { WSAHOST_NOT_FOUND, "Host not found" },
  101.     { WSATRY_AGAIN, "Nonauthoritative host not found (temporary hostname error)" },
  102.     { WSANO_RECOVERY, "Non-recoverable hostname error" },
  103.     { WSANO_DATA, "Valid name, no data record of requested type" },
  104.     { WSA_QOS_RECEIVERS, "QOS receivers" },
  105.     { WSA_QOS_SENDERS, "QOS senders" },
  106.     { WSA_QOS_NO_SENDERS, "No QOS senders" },
  107.     { WSA_QOS_NO_RECEIVERS, "QOS no receivers" },
  108.     { WSA_QOS_REQUEST_CONFIRMED, "QOS request confirmed" },
  109.     { WSA_QOS_ADMISSION_FAILURE, "QOS admission error" },
  110.     { WSA_QOS_POLICY_FAILURE, "QOS policy failure" },
  111.     { WSA_QOS_BAD_STYLE, "QOS bad style" },
  112.     { WSA_QOS_BAD_OBJECT, "QOS bad object" },
  113.     { WSA_QOS_TRAFFIC_CTRL_ERROR, "QOS traffic control error" },
  114.     { WSA_QOS_GENERIC_ERROR, "QOS generic error" },
  115.     { WSA_QOS_ESERVICETYPE, "QOS service type error" },
  116.     { WSA_QOS_EFLOWSPEC, "QOS flowspec error" },
  117.     { WSA_QOS_EPROVSPECBUF, "Invalid QOS provider buffer" },
  118.     { WSA_QOS_EFILTERSTYLE, "Invalid QOS filter style" },
  119.     { WSA_QOS_EFILTERTYPE, "Invalid QOS filter type" },
  120.     { WSA_QOS_EFILTERCOUNT, "Incorrect QOS filter count" },
  121.     { WSA_QOS_EOBJLENGTH, "Invalid QOS object length" },
  122.     { WSA_QOS_EFLOWCOUNT, "Incorrect QOS flow count" },
  123.     { WSA_QOS_EUNKNOWNPSOBJ, "Unrecognized QOS object" },
  124.     { WSA_QOS_EPOLICYOBJ, "Invalid QOS policy object" },
  125.     { WSA_QOS_EFLOWDESC, "Invalid QOS flow descriptor" },
  126.     { WSA_QOS_EPSFLOWSPEC, "Invalid QOS provider-specific flowspec" },
  127.     { WSA_QOS_EPSFILTERSPEC, "Invalid QOS provider-specific filterspec" },
  128.     { WSA_QOS_ESDMODEOBJ, "Invalid QOS shape discard mode object" },
  129.     { WSA_QOS_ESHAPERATEOBJ, "Invalid QOS shaping rate object" },
  130.     { WSA_QOS_RESERVED_PETYPE, "Reserved policy QOS element type" },
  131.     { 0, NULL }
  132.     /* Winsock2 error codes are missing, they "never" occur */
  133. };
  134. const char *net_strerror( int value )
  135. {
  136.     /* There doesn't seem to be any portable error message generation for
  137.      * Winsock errors. Some old versions had s_error, but it appears to be
  138.      * gone, and is not documented.
  139.      */
  140.     for( const wsaerrmsg_t *e = wsaerrmsg; e->msg != NULL; e++ )
  141.         if( e->code == value )
  142.             return e->msg;
  143.     /* Remember to update src/misc/messages.c if you change this one */
  144.     return "Unknown network stack error";
  145. }
  146. #if 0
  147. ssize_t vlc_sendmsg (int s, struct msghdr *hdr, int flags)
  148. {
  149.     /* WSASendMsg would be more straightforward, and would support ancilliary
  150.      * data, but it's not yet in mingw32. */
  151.     if ((hdr->msg_iovlen > 100) || (hdr->msg_controllen > 0))
  152.     {
  153.         errno = EINVAL;
  154.         return -1;
  155.     }
  156.     WSABUF buf[hdr->msg_iovlen];
  157.     for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++)
  158.         buf[i].buf = hdr->msg_iov[i].iov_base,
  159.         buf[i].len = hdr->msg_iov[i].iov_len;
  160.     DWORD sent;
  161.     if (WSASendTo (s, buf, sizeof (buf) / sizeof (buf[0]), &sent, flags,
  162.                    hdr->msg_name, hdr->msg_namelen, NULL, NULL) == 0)
  163.         return sent;
  164.     return -1;
  165. }
  166. ssize_t vlc_recvmsg (int s, struct msghdr *hdr, int flags)
  167. {
  168.     /* WSARecvMsg would be more straightforward, and would support ancilliary
  169.      * data, but it's not yet in mingw32. */
  170.     if (hdr->msg_iovlen > 100)
  171.     {
  172.         errno = EINVAL;
  173.         return -1;
  174.     }
  175.     WSABUF buf[hdr->msg_iovlen];
  176.     for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++)
  177.         buf[i].buf = hdr->msg_iov[i].iov_base,
  178.         buf[i].len = hdr->msg_iov[i].iov_len;
  179.     DWORD recvd, dwFlags = flags;
  180.     INT fromlen = hdr->msg_namelen;
  181.     hdr->msg_controllen = 0;
  182.     hdr->msg_flags = 0;
  183.     int ret = WSARecvFrom (s, buf, sizeof (buf) / sizeof (buf[0]), &recvd,
  184.                            &dwFlags, hdr->msg_name, &fromlen, NULL, NULL);
  185.     hdr->msg_namelen = fromlen;
  186.     hdr->msg_flags = dwFlags;
  187.     if (ret == 0)
  188.         return recvd;
  189. #ifdef MSG_TRUNC
  190.     if (WSAGetLastError() == WSAEMSGSIZE)
  191.     {
  192.         hdr->msg_flags |= MSG_TRUNC;
  193.         return recvd;
  194.     }
  195. #else
  196. # warning Out-of-date Winsock header files!
  197. #endif
  198.     return -1;
  199. }
  200. #endif