📄 cfsocket.cpp
字号:
child_socket = GSocket_WaitConnection(m_socket); if (!wait) GSocket_SetNonBlocking(m_socket, 0); if (!child_socket) return false; sock.m_type = wxSOCKET_BASE; sock.m_socket = child_socket; sock.m_connected = true; GSocket_SetTimeout(sock.m_socket, sock.m_timeout * 1000); GSocket_SetCallback(sock.m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG | GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG, wx_socket_callback, (char *)&sock);#endif return true;}wxSocketBase *wxSocketServer::Accept(bool wait){ wxSocketBase* sock = new wxSocketBase(); sock->SetFlags(m_flags); if (!AcceptWith(*sock, wait)) { sock->Destroy(); sock = NULL; } return sock;}bool wxSocketServer::WaitForAccept(long seconds, long milliseconds){ return _Wait(seconds, milliseconds, GSOCK_CONNECTION_FLAG);}// ==========================================================================// wxSocketClient// ==========================================================================// --------------------------------------------------------------------------// Ctor and dtor// --------------------------------------------------------------------------wxSocketClient::wxSocketClient(wxSocketFlags flags) : wxSocketBase(flags, wxSOCKET_CLIENT){}wxSocketClient::~wxSocketClient(){}// --------------------------------------------------------------------------// Connect// --------------------------------------------------------------------------bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait){ GSocketError err; if (m_socket) { // Shutdown and destroy the socket Close(); GSocket_destroy(m_socket); } m_socket = GSocket_new(); m_connected = false; m_establishing = false; if (!m_socket) return false; GSocket_SetTimeout(m_socket, m_timeout * 1000); GSocket_SetCallback(m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG | GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG, wx_socket_callback, (char *)this); // If wait == false, then the call should be nonblocking. // When we are finished, we put the socket to blocking mode // again. if (!wait) GSocket_SetNonBlocking(m_socket, 1); GSocket_SetPeer(m_socket, addr_man.GetAddress()); err = GSocket_Connect(m_socket, GSOCK_STREAMED); if (!wait) GSocket_SetNonBlocking(m_socket, 0); if (err != GSOCK_NOERROR) { if (err == GSOCK_WOULDBLOCK) m_establishing = true; return false; } m_connected = true; return true;}bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds){ if (m_connected) // Already connected return true; if (!m_establishing || !m_socket) // No connection in progress return false; return _Wait(seconds, milliseconds, GSOCK_CONNECTION_FLAG | GSOCK_LOST_FLAG);}// ==========================================================================// wxDatagramSocket// ==========================================================================/* NOTE: experimental stuff - might change */wxDatagramSocket::wxDatagramSocket( wxSockAddress& addr, wxSocketFlags flags ) : wxSocketBase( flags, wxSOCKET_DATAGRAM ){#if 0 // Create the socket m_socket = GSocket_new(); if (!m_socket) return; // Setup the socket as non connection oriented GSocket_SetLocal(m_socket, addr.GetAddress()); if( GSocket_SetNonOriented(m_socket) != GSOCK_NOERROR ) { GSocket_destroy(m_socket); m_socket = NULL; return; } // Initialize all stuff m_connected = false; m_establishing = false; GSocket_SetTimeout( m_socket, m_timeout ); GSocket_SetCallback( m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG | GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG, wx_socket_callback, (char*)this );#endif}wxDatagramSocket& wxDatagramSocket::RecvFrom( wxSockAddress& addr, void* buf, wxUint32 nBytes ){ Read(buf, nBytes); GetPeer(addr); return (*this);}wxDatagramSocket& wxDatagramSocket::SendTo( wxSockAddress& addr, const void* buf, wxUint32 nBytes ){ GSocket_SetPeer(m_socket, addr.GetAddress()); Write(buf, nBytes); return (*this);}/* * ------------------------------------------------------------------------- * GAddress * ------------------------------------------------------------------------- *//* CHECK_ADDRESS verifies that the current address family is either * GSOCK_NOFAMILY or GSOCK_*family*, and if it is GSOCK_NOFAMILY, it * initalizes it to be a GSOCK_*family*. In other cases, it returns * an appropiate error code. * * CHECK_ADDRESS_RETVAL does the same but returning 'retval' on error. */#define CHECK_ADDRESS(address, family) \{ \ if (address->m_family == GSOCK_NOFAMILY) \ if (_GAddress_Init_##family(address) != GSOCK_NOERROR) \ return address->m_error; \ if (address->m_family != GSOCK_##family) \ { \ address->m_error = GSOCK_INVADDR; \ return GSOCK_INVADDR; \ } \}#define CHECK_ADDRESS_RETVAL(address, family, retval) \{ \ if (address->m_family == GSOCK_NOFAMILY) \ if (_GAddress_Init_##family(address) != GSOCK_NOERROR) \ return retval; \ if (address->m_family != GSOCK_##family) \ { \ address->m_error = GSOCK_INVADDR; \ return retval; \ } \}GAddress *GAddress_new(void){ GAddress *address; if ((address = (GAddress *) malloc(sizeof(GAddress))) == NULL) return NULL; address->m_family = GSOCK_NOFAMILY; address->m_addr = NULL; address->m_len = 0; return address;}GAddress *GAddress_copy(GAddress *address){ GAddress *addr2; assert(address != NULL); if ((addr2 = (GAddress *) malloc(sizeof(GAddress))) == NULL) return NULL; memcpy(addr2, address, sizeof(GAddress)); if (address->m_addr && address->m_len > 0) { addr2->m_addr = (struct sockaddr *)malloc(addr2->m_len); if (addr2->m_addr == NULL) { free(addr2); return NULL; } memcpy(addr2->m_addr, address->m_addr, addr2->m_len); } return addr2;}void GAddress_destroy(GAddress *address){ assert( address != NULL ); if (address->m_addr) free(address->m_addr); free(address);}void GAddress_SetFamily(GAddress *address, GAddressType type){ assert(address != NULL); address->m_family = type;}GAddressType GAddress_GetFamily(GAddress *address){ assert( address != NULL ); return address->m_family;}GSocketError _GAddress_translate_from(GAddress *address, struct sockaddr *addr, int len){ address->m_realfamily = addr->sa_family; switch (addr->sa_family) { case AF_INET: address->m_family = GSOCK_INET; break; case AF_UNIX: address->m_family = GSOCK_UNIX; break;#ifdef AF_INET6 case AF_INET6: address->m_family = GSOCK_INET6; break;#endif default: { address->m_error = GSOCK_INVOP; return GSOCK_INVOP; } } if (address->m_addr) free(address->m_addr); address->m_len = len; address->m_addr = (struct sockaddr *)malloc(len); if (address->m_addr == NULL) { address->m_error = GSOCK_MEMERR; return GSOCK_MEMERR; } memcpy(address->m_addr, addr, len); return GSOCK_NOERROR;}GSocketError _GAddress_translate_to(GAddress *address, struct sockaddr **addr, int *len){ if (!address->m_addr) { address->m_error = GSOCK_INVADDR; return GSOCK_INVADDR; } *len = address->m_len; *addr = (struct sockaddr *)malloc(address->m_len); if (*addr == NULL) { address->m_error = GSOCK_MEMERR; return GSOCK_MEMERR; } memcpy(*addr, address->m_addr, address->m_len); return GSOCK_NOERROR;}/* * ------------------------------------------------------------------------- * Internet address family * ------------------------------------------------------------------------- */GSocketError _GAddress_Init_INET(GAddress *address){ address->m_len = sizeof(struct sockaddr_in); address->m_addr = (struct sockaddr *) malloc(address->m_len); if (address->m_addr == NULL) { address->m_error = GSOCK_MEMERR; return GSOCK_MEMERR; } memset( address->m_addr , 0 , address->m_len ) ; address->m_family = GSOCK_INET; address->m_realfamily = PF_INET; ((struct sockaddr_in *)address->m_addr)->sin_family = AF_INET; ((struct sockaddr_in *)address->m_addr)->sin_addr.s_addr = INADDR_ANY; return GSOCK_NOERROR;}GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname){ struct hostent *he; struct in_addr *addr; assert( address != NULL ); CHECK_ADDRESS( address, INET ); addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr); // If it is a numeric host name, convert it now#if defined(HAVE_INET_ATON) if (inet_aton(hostname, addr) == 0) {#elif defined(HAVE_INET_ADDR) if ( (addr->s_addr = inet_addr(hostname)) == -1 ) {#else // Use gethostbyname by default#ifndef __WXMAC__ int val = 1; // VA doesn't like constants in conditional expressions if (val)#endif {#endif struct in_addr *array_addr; // It is a real name, we solve it if ((he = gethostbyname(hostname)) == NULL) { // Reset to invalid address addr->s_addr = INADDR_NONE; address->m_error = GSOCK_NOHOST; return GSOCK_NOHOST; } array_addr = (struct in_addr *) *(he->h_addr_list); addr->s_addr = array_addr[0].s_addr; } return GSOCK_NOERROR;}GSocketError GAddress_INET_SetAnyAddress(GAddress *address){ return GAddress_INET_SetHostAddress(address, INADDR_ANY);}GSocketError GAddress_INET_SetHostAddress(GAddress *address, unsigned long hostaddr){ struct in_addr *addr; assert( address != NULL ); CHECK_ADDRESS( address, INET ); addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr); addr->s_addr = htonl(hostaddr) ; return GSOCK_NOERROR;}GSocketError GAddress_INET_SetPortName(GAddress *address, const char *port, const char *protocol){ struct servent *se; struct sockaddr_in *addr; assert( address != NULL ); CHECK_ADDRESS( address, INET ); if (!port) { address->m_error = GSOCK_INVPORT; return GSOCK_INVPORT; } se = getservbyname(port, protocol); if (!se) { // the cast to int suppresses compiler warnings // about subscript having the type char if (isdigit((int)port[0])) { int port_int; port_int = atoi(port); addr = (struct sockaddr_in *)address->m_addr; addr->sin_port = htons(port_int); return GSOCK_NOERROR; } address->m_error = GSOCK_INVPORT; return GSOCK_INVPORT; } addr = (struct sockaddr_in *)address->m_addr; addr->sin_port = se->s_port; return GSOCK_NOERROR;}GSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port){ struct sockaddr_in *addr; assert( address != NULL ); CHECK_ADDRESS( address, INET ); addr = (struct sockaddr_in *)address->m_addr; addr->sin_port = htons(port); return GSOCK_NOERROR;}GSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname, size_t sbuf){ struct hostent *he; char *addr_buf; struct sockaddr_in *addr; assert( address != NULL ); CHECK_ADDRESS( address, INET ); addr = (struct sockaddr_in *)address->m_addr; addr_buf = (char *)&(addr->sin_addr); he = gethostbyaddr(addr_buf, sizeof(addr->sin_addr), AF_INET); if (he == NULL) { address->m_error = GSOCK_NOHOST; return GSOCK_NOHOST; } strncpy(hostname, he->h_name, sbuf); return GSOCK_NOERROR;}unsigned long GAddress_INET_GetHostAddress(GAddress *address){ struct sockaddr_in *addr; assert( address != NULL ); CHECK_ADDRESS_RETVAL( address, INET, 0 ); addr = (struct sockaddr_in *)address->m_addr; return ntohl(addr->sin_addr.s_addr) ;}unsigned short GAddress_INET_GetPort(GAddress *address){ struct sockaddr_in *addr; assert( address != NULL ); CHECK_ADDRESS_RETVAL( address, INET, 0 ); addr = (struct sockaddr_in *)address->m_addr; return ntohs(addr->sin_port);}/* * ------------------------------------------------------------------------- * Unix address family * ------------------------------------------------------------------------- */GSocketError _GAddress_Init_UNIX(GAddress *address){ address->m_len = sizeof(struct sockaddr_un); address->m_addr = (struct sockaddr *)malloc(address->m_len); if (address->m_addr == NULL) { address->m_error = GSOCK_MEMERR; return GSOCK_MEMERR; } address->m_family = GSOCK_UNIX; address->m_realfamily = PF_UNIX; ((struct sockaddr_un *)address->m_addr)->sun_family = AF_UNIX; ((struct sockaddr_un *)address->m_addr)->sun_path[0] = 0; return GSOCK_NOERROR;}#define UNIX_SOCK_PATHLEN (sizeof(addr->sun_path)/sizeof(addr->sun_path[0]))GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path){ struct sockaddr_un *addr; assert( address != NULL ); CHECK_ADDRESS( address, UNIX ); addr = ((struct sockaddr_un *)address->m_addr); strncpy(addr->sun_path, path, UNIX_SOCK_PATHLEN); addr->sun_path[UNIX_SOCK_PATHLEN - 1] = '\0'; return GSOCK_NOERROR;}GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf){ struct sockaddr_un *addr; assert( address != NULL ); CHECK_ADDRESS( address, UNIX );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -