📄 winsock.cxx
字号:
qos->SendingFlowspec.Latency = QOS_NOT_SPECIFIED; qos->SendingFlowspec.DelayVariation = QOS_NOT_SPECIFIED; qos->SendingFlowspec.MaxSduSize = QOS_NOT_SPECIFIED; qos->SendingFlowspec.MinimumPolicedSize = QOS_NOT_SPECIFIED; qos->ReceivingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT|SERVICE_NO_QOS_SIGNALING; qos->ReceivingFlowspec.TokenRate = QOS_NOT_SPECIFIED; qos->ReceivingFlowspec.TokenBucketSize = QOS_NOT_SPECIFIED; qos->ReceivingFlowspec.PeakBandwidth = QOS_NOT_SPECIFIED; qos->ReceivingFlowspec.Latency = QOS_NOT_SPECIFIED; qos->ReceivingFlowspec.DelayVariation = QOS_NOT_SPECIFIED; qos->ReceivingFlowspec.MaxSduSize = QOS_NOT_SPECIFIED; qos->ReceivingFlowspec.MinimumPolicedSize = QOS_NOT_SPECIFIED; sa = new sockaddr; *sa = *to; QOS_DESTADDR qosdestaddr; qosdestaddr.ObjectHdr.ObjectType = QOS_OBJECT_DESTADDR; qosdestaddr.ObjectHdr.ObjectLength = sizeof(qosdestaddr); qosdestaddr.SocketAddress = sa; qosdestaddr.SocketAddressLength = sizeof(*sa); qos->ProviderSpecific.len = sizeof(qosdestaddr); qos->ProviderSpecific.buf = inBuf + sizeof(*qos); memcpy(inBuf+sizeof(*qos),&qosdestaddr,sizeof(qosdestaddr)); bufLen = sizeof(*qos)+sizeof(qosdestaddr);}#endif // _WIN32_WCE#endif // P_HAS_QOS#ifndef _WIN32_WCE//////////////////////////////////////////////////////////////////////////////// PIPXSocketPIPXSocket::Address::Address(){ memset(this, 0, sizeof(*this));}PIPXSocket::Address::Address(const Address & addr){ memcpy(this, &addr, sizeof(*this));}PIPXSocket::Address::Address(const PString & str){ PINDEX colon = str.Find(':'); if (colon == P_MAX_INDEX) colon = 0; else { DWORD netnum = 0; for (PINDEX i = 0; i < colon; i++) { int c = str[i]; if (isdigit(c)) netnum = (netnum << 4) + c - '0'; else if (isxdigit(c)) netnum = (netnum << 4) + toupper(c) - 'A' + 10; else { memset(this, 0, sizeof(*this)); return; } } network.dw = ntohl(netnum); } memset(node, 0, sizeof(node)); int shift = 0; PINDEX byte = 5; PINDEX pos = str.GetLength(); while (--pos > colon) { int c = str[pos]; if (c != '-') { if (isdigit(c)) node[byte] |= (c - '0') << shift; else if (isxdigit(c)) node[byte] |= (toupper(c) - 'A' + 10) << shift; else { memset(this, 0, sizeof(*this)); return; } if (shift == 0) shift = 4; else { shift = 0; byte--; } } }}PIPXSocket::Address::Address(DWORD netNum, const char * nodeNum){ network.dw = netNum; memcpy(node, nodeNum, sizeof(node));}PIPXSocket::Address & PIPXSocket::Address::operator=(const Address & addr){ memcpy(this, &addr, sizeof(*this)); return *this;}PIPXSocket::Address::operator PString() const{ return psprintf("%02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X", network.b.b1, network.b.b2, network.b.b3, network.b.b4, node[0], node[1], node[2], node[3], node[4], node[5]);}BOOL PIPXSocket::Address::IsValid() const{ static Address empty; return memcmp(this, &empty, sizeof(empty)) != 0;}PIPXSocket::PIPXSocket(WORD newPort){ SetPort(newPort);}PString PIPXSocket::GetName() const{ Address addr; if (((PIPXSocket*)this)->GetPeerAddress(addr)) return addr; else return PString();}BOOL PIPXSocket::OpenSocket(){ return ConvertOSError(os_handle = os_socket(AF_IPX, SOCK_DGRAM, NSPROTO_IPX));}const char * PIPXSocket::GetProtocolName() const{ return "ipx";}BOOL PIPXSocket::SetPacketType(int type){ return ConvertOSError(::setsockopt(os_handle, NSPROTO_IPX, IPX_PTYPE, (char *)&type, sizeof(type)));}int PIPXSocket::GetPacketType(){ int value; int valSize = sizeof(value); if (ConvertOSError(::getsockopt(os_handle, NSPROTO_IPX, IPX_PTYPE, (char *)&value, &valSize))) return value; return -1;}PString PIPXSocket::GetHostName(const Address & addr){ return addr;}BOOL PIPXSocket::GetHostAddress(Address &){ return FALSE;}static void AssignAddress(sockaddr_ipx & sip, const PIPXSocket::Address & addr){ memcpy(sip.sa_netnum, &addr.network, sizeof(sip.sa_netnum)); memcpy(sip.sa_nodenum, addr.node, sizeof(sip.sa_nodenum));}static void AssignAddress(PIPXSocket::Address & addr, const sockaddr_ipx & sip){ memcpy(&addr.network, sip.sa_netnum, sizeof(addr.network)); memcpy(addr.node, sip.sa_nodenum, sizeof(addr.node));}#ifdef P_HAS_QOSBOOL PIPXSocket::GetHostAddress(const PString & /*hostname*/, Address & /*addr*/){ return FALSE;}#elseBOOL PIPXSocket::GetHostAddress(const PString & hostname, Address & addr){ addr = hostname; if (addr.IsValid()) return TRUE; static GUID netware_file_server = SVCID_FILE_SERVER; CSADDR_INFO addr_info[10]; DWORD buffer_length = sizeof(addr_info); int num = GetAddressByName(NS_DEFAULT, &netware_file_server, (LPTSTR)(const char *)hostname, NULL, 0, NULL, addr_info, &buffer_length, NULL, NULL ); if (num <= 0) return FALSE; AssignAddress(addr, *(sockaddr_ipx *)addr_info[0].RemoteAddr.lpSockaddr); return TRUE;}#endifBOOL PIPXSocket::GetLocalAddress(Address & addr){ sockaddr_ipx sip; int size = sizeof(sip); if (!ConvertOSError(::getsockname(os_handle, (struct sockaddr *)&sip, &size))) return FALSE; AssignAddress(addr, sip); return TRUE;}BOOL PIPXSocket::GetLocalAddress(Address & addr, WORD & portNum){ sockaddr_ipx sip; int size = sizeof(sip); if (!ConvertOSError(::getsockname(os_handle, (struct sockaddr *)&sip, &size))) return FALSE; AssignAddress(addr, sip); portNum = Net2Host(sip.sa_socket); return TRUE;}BOOL PIPXSocket::GetPeerAddress(Address & addr){ sockaddr_ipx sip; int size = sizeof(sip); if (!ConvertOSError(::getpeername(os_handle, (struct sockaddr *)&sip, &size))) return FALSE; AssignAddress(addr, sip); return TRUE;}BOOL PIPXSocket::GetPeerAddress(Address & addr, WORD & portNum){ sockaddr_ipx sip; int size = sizeof(sip); if (!ConvertOSError(::getpeername(os_handle, (struct sockaddr *)&sip, &size))) return FALSE; AssignAddress(addr, sip); portNum = Net2Host(sip.sa_socket); return TRUE;}BOOL PIPXSocket::Connect(const PString & host){ Address addr; if (GetHostAddress(host, addr)) return Connect(addr); return FALSE;}BOOL PIPXSocket::Connect(const Address & addr){ // close the port if it is already open if (IsOpen()) Close(); // make sure we have a port PAssert(port != 0, "Cannot connect socket without setting port"); // attempt to create a socket if (!OpenSocket()) return FALSE; // attempt to lookup the host name sockaddr_ipx sip; memset(&sip, 0, sizeof(sip)); sip.sa_family = AF_IPX; AssignAddress(sip, addr); sip.sa_socket = Host2Net(port); // set the port if (os_connect((struct sockaddr *)&sip, sizeof(sip))) return TRUE; os_close(); return FALSE;}BOOL PIPXSocket::Listen(unsigned, WORD newPort, Reusability reuse){ // make sure we have a port if (newPort != 0) port = newPort; // close the port if it is already open if (!IsOpen()) { // attempt to create a socket if (!OpenSocket()) return FALSE; } // attempt to listen if (SetOption(SO_REUSEADDR, reuse == CanReuseAddress ? 1 : 0)) { // attempt to listen sockaddr_ipx sip; memset(&sip, 0, sizeof(sip)); sip.sa_family = AF_IPX; sip.sa_socket = Host2Net(port); // set the port if (ConvertOSError(::bind(os_handle, (struct sockaddr*)&sip, sizeof(sip)))) { int size = sizeof(sip); if (ConvertOSError(::getsockname(os_handle, (struct sockaddr*)&sip, &size))) { port = Net2Host(sip.sa_socket); return TRUE; } } } os_close(); return FALSE;}BOOL PIPXSocket::ReadFrom(void * buf, PINDEX len, Address & addr, WORD & port){ lastReadCount = 0; sockaddr_ipx sip; int addrLen = sizeof(sip); if (os_recvfrom(buf, len, 0, (struct sockaddr *)&sip, &addrLen)) { AssignAddress(addr, sip); port = Net2Host(sip.sa_socket); } return lastReadCount > 0;}BOOL PIPXSocket::WriteTo(const void * buf, PINDEX len, const Address & addr, WORD port){ lastWriteCount = 0; sockaddr_ipx sip; sip.sa_family = AF_IPX; AssignAddress(sip, addr); sip.sa_socket = Host2Net(port); return os_sendto(buf, len, 0, (struct sockaddr *)&sip, sizeof(sip));}//////////////////////////////////////////////////////////////////////////////// PSPXSocketPSPXSocket::PSPXSocket(WORD port) : PIPXSocket(port){}BOOL PSPXSocket::OpenSocket(){ return ConvertOSError(os_handle = os_socket(AF_IPX, SOCK_STREAM, NSPROTO_SPX));}const char * PSPXSocket::GetProtocolName() const{ return "spx";}BOOL PSPXSocket::Listen(unsigned queueSize, WORD newPort, Reusability reuse){ if (PIPXSocket::Listen(queueSize, newPort, reuse) && ConvertOSError(::listen(os_handle, queueSize))) return TRUE; os_close(); return FALSE;}BOOL PSPXSocket::Accept(PSocket & socket){ PAssert(PIsDescendant(&socket, PIPXSocket), "Invalid listener socket"); sockaddr_ipx sip; sip.sa_family = AF_IPX; int size = sizeof(sip); if (!os_accept(socket, (struct sockaddr *)&sip, &size)) return FALSE; port = ((PIPXSocket &)socket).GetPort(); return TRUE;}#endif// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -