⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winsock.c

📁 VLC Player Source Code
💻 C
字号:
/***************************************************************************** * winsock.c: POSIX replacements for Winsock ***************************************************************************** * Copyright © 2006-2008 Rémi Denis-Courmont * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <errno.h>#include <vlc_network.h>typedef struct{    int code;    const char *msg;} wsaerrmsg_t;static const wsaerrmsg_t wsaerrmsg[] ={    { WSA_INVALID_HANDLE, "Specified event object handle is invalid" },    { WSA_NOT_ENOUGH_MEMORY, "Insufficient memory available" },    { WSA_INVALID_PARAMETER, "One or more parameters are invalid" },    { WSA_OPERATION_ABORTED, "Overlapped operation aborted" },    { WSA_IO_INCOMPLETE, "Overlapped I/O event object not in signaled state" },    { WSA_IO_PENDING, "Overlapped operations will complete later" },    { WSAEINTR, "Interrupted function call" },    { WSAEBADF, "File handle is not valid" },    { WSAEACCES, "Access denied" },    { WSAEFAULT, "Invalid memory address" },    { WSAEINVAL, "Invalid argument" },    { WSAEMFILE, "Too many open sockets" },    { WSAEWOULDBLOCK, "Resource temporarily unavailable" },    { WSAEINPROGRESS, "Operation now in progress" },    { WSAEALREADY, "Operation already in progress" },    { WSAENOTSOCK, "Non-socket handle specified" },    { WSAEDESTADDRREQ, "Missing destination address" },    { WSAEMSGSIZE, "Message too long" },    { WSAEPROTOTYPE, "Protocol wrong type for socket", },    { WSAENOPROTOOPT, "Option not supported by protocol" },    { WSAEPROTONOSUPPORT, "Protocol not supported" },    { WSAESOCKTNOSUPPORT, "Socket type not supported" },    { WSAEOPNOTSUPP, "Operation not supported" },    { WSAEPFNOSUPPORT, "Protocol family not supported" },    { WSAEAFNOSUPPORT, "Address family not supported by protocol family" },    { WSAEADDRINUSE, "Address already in use" },    { WSAEADDRNOTAVAIL, "Cannot assign requested address" },    { WSAENETDOWN, "Network is down" },    { WSAENETUNREACH, "Network unreachable" },    { WSAENETRESET, "Network dropped connection on reset" },    { WSAECONNABORTED, "Software caused connection abort" },    { WSAECONNRESET, "Connection reset by peer" },    { WSAENOBUFS, "No buffer space available (not enough memory)" },    { WSAEISCONN, "Socket is already connected" },    { WSAENOTCONN, "Socket is not connected" },    { WSAESHUTDOWN, "Cannot send after socket shutdown" },    { WSAETOOMANYREFS, "Too many references" },    { WSAETIMEDOUT, "Connection timed out" },    { WSAECONNREFUSED, "Connection refused by peer" },    { WSAELOOP, "Cannot translate name" },    { WSAENAMETOOLONG, "Name too long" },    { WSAEHOSTDOWN, "Remote host is down" },    { WSAEHOSTUNREACH, "No route to host (unreachable)" },    { WSAENOTEMPTY, "Directory not empty" },    { WSAEPROCLIM, "Too many processes" },    { WSAEUSERS, "User quota exceeded" },    { WSAEDQUOT, "Disk quota exceeded" },    { WSAESTALE, "Stale file handle reference" },    { WSAEREMOTE, "Item is remote", },    { WSASYSNOTREADY, "Network subsystem is unavailable (network stack not ready)" },    { WSAVERNOTSUPPORTED, "Winsock.dll version out of range (network stack version not supported" },    { WSANOTINITIALISED, "Network not initialized" },    { WSAEDISCON, "Graceful shutdown in progress" },    { WSAENOMORE, "No more results" },    { WSAECANCELLED, "Call has been cancelled" },    { WSAEINVALIDPROCTABLE, "Procedure call table is invalid" },    { WSAEINVALIDPROVIDER, "Service provider is invalid" },    { WSAEPROVIDERFAILEDINIT, "Service provider failed to initialize" },    { WSASYSCALLFAILURE, "System call failure" },    { WSASERVICE_NOT_FOUND, "Service not found" },    { WSATYPE_NOT_FOUND, "Class type not found" },    { WSA_E_NO_MORE, "No more results" },    { WSA_E_CANCELLED, "Call was cancelled" },    { WSAEREFUSED, "Database query was refused" },    { WSAHOST_NOT_FOUND, "Host not found" },    { WSATRY_AGAIN, "Nonauthoritative host not found (temporary hostname error)" },    { WSANO_RECOVERY, "Non-recoverable hostname error" },    { WSANO_DATA, "Valid name, no data record of requested type" },    { WSA_QOS_RECEIVERS, "QOS receivers" },    { WSA_QOS_SENDERS, "QOS senders" },    { WSA_QOS_NO_SENDERS, "No QOS senders" },    { WSA_QOS_NO_RECEIVERS, "QOS no receivers" },    { WSA_QOS_REQUEST_CONFIRMED, "QOS request confirmed" },    { WSA_QOS_ADMISSION_FAILURE, "QOS admission error" },    { WSA_QOS_POLICY_FAILURE, "QOS policy failure" },    { WSA_QOS_BAD_STYLE, "QOS bad style" },    { WSA_QOS_BAD_OBJECT, "QOS bad object" },    { WSA_QOS_TRAFFIC_CTRL_ERROR, "QOS traffic control error" },    { WSA_QOS_GENERIC_ERROR, "QOS generic error" },    { WSA_QOS_ESERVICETYPE, "QOS service type error" },    { WSA_QOS_EFLOWSPEC, "QOS flowspec error" },    { WSA_QOS_EPROVSPECBUF, "Invalid QOS provider buffer" },    { WSA_QOS_EFILTERSTYLE, "Invalid QOS filter style" },    { WSA_QOS_EFILTERTYPE, "Invalid QOS filter type" },    { WSA_QOS_EFILTERCOUNT, "Incorrect QOS filter count" },    { WSA_QOS_EOBJLENGTH, "Invalid QOS object length" },    { WSA_QOS_EFLOWCOUNT, "Incorrect QOS flow count" },    { WSA_QOS_EUNKNOWNPSOBJ, "Unrecognized QOS object" },    { WSA_QOS_EPOLICYOBJ, "Invalid QOS policy object" },    { WSA_QOS_EFLOWDESC, "Invalid QOS flow descriptor" },    { WSA_QOS_EPSFLOWSPEC, "Invalid QOS provider-specific flowspec" },    { WSA_QOS_EPSFILTERSPEC, "Invalid QOS provider-specific filterspec" },    { WSA_QOS_ESDMODEOBJ, "Invalid QOS shape discard mode object" },    { WSA_QOS_ESHAPERATEOBJ, "Invalid QOS shaping rate object" },    { WSA_QOS_RESERVED_PETYPE, "Reserved policy QOS element type" },    { 0, NULL }    /* Winsock2 error codes are missing, they "never" occur */};const char *net_strerror( int value ){    /* There doesn't seem to be any portable error message generation for     * Winsock errors. Some old versions had s_error, but it appears to be     * gone, and is not documented.     */    for( const wsaerrmsg_t *e = wsaerrmsg; e->msg != NULL; e++ )        if( e->code == value )            return e->msg;    /* Remember to update src/misc/messages.c if you change this one */    return "Unknown network stack error";}ssize_t vlc_sendmsg (int s, struct msghdr *hdr, int flags){    /* WSASendMsg would be more straightforward, and would support ancilliary     * data, but it's not yet in mingw32. */    if ((hdr->msg_iovlen > 100) || (hdr->msg_controllen > 0))    {        errno = EINVAL;        return -1;    }    WSABUF buf[hdr->msg_iovlen];    for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++)        buf[i].buf = hdr->msg_iov[i].iov_base,        buf[i].len = hdr->msg_iov[i].iov_len;    DWORD sent;    if (WSASendTo (s, buf, sizeof (buf) / sizeof (buf[0]), &sent, flags,                   hdr->msg_name, hdr->msg_namelen, NULL, NULL) == 0)        return sent;    return -1;}ssize_t vlc_recvmsg (int s, struct msghdr *hdr, int flags){    /* WSARecvMsg would be more straightforward, and would support ancilliary     * data, but it's not yet in mingw32. */    if (hdr->msg_iovlen > 100)    {        errno = EINVAL;        return -1;    }    WSABUF buf[hdr->msg_iovlen];    for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++)        buf[i].buf = hdr->msg_iov[i].iov_base,        buf[i].len = hdr->msg_iov[i].iov_len;    DWORD recvd, dwFlags = flags;    INT fromlen = hdr->msg_namelen;    hdr->msg_controllen = 0;    hdr->msg_flags = 0;    int ret = WSARecvFrom (s, buf, sizeof (buf) / sizeof (buf[0]), &recvd,                           &dwFlags, hdr->msg_name, &fromlen, NULL, NULL);    hdr->msg_namelen = fromlen;    hdr->msg_flags = dwFlags;    if (ret == 0)        return recvd;#ifdef MSG_TRUNC    if (WSAGetLastError() == WSAEMSGSIZE)    {        hdr->msg_flags |= MSG_TRUNC;        return recvd;    }#else# warning Out-of-date Winsock header files!#endif    return -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -