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

📄 winsockex.c

📁 Web服务器V1.01,Win Socket底层开发
💻 C
字号:
/********************************************************************
** WebSrv -- WinSockEx.c
**
** Steven Lee	2002.11
********************************************************************/

#include "WinSockEx.h"

#include <Windows.h>
#include <TCHAR.h>
#include <string.h>
#include <stdio.h>

BOOL InitWinSocket(LPTSTR lpszError)
{
	int		nErr;
	WSADATA	wsaData;
	WORD	wVerRequest = MAKEWORD(2,2);

	nErr = WSAStartup( wVerRequest,&wsaData );
	if( nErr != 0 )
	{
		_stprintf( lpszError,_T("Cannot find a usable Socket DLL\r\n") );
		return FALSE;
	}

	if( (HIBYTE(wsaData.wVersion) != 2) || (LOBYTE(wsaData.wVersion) < 2) )
	{
		_stprintf( lpszError,_T("Socket DLL version error\r\n") );
		WSACleanup();
		return FALSE;
	}

	return TRUE;
}

SOCKET CreateSrvSocket(UINT nPort,LPTSTR lpszError)
{
	SOCKET				hSocket;
	struct sockaddr_in	si_server;

	hSocket = socket( AF_INET,SOCK_STREAM,0 );				//Create a socket
	if( hSocket == INVALID_SOCKET )
	{
		if( lpszError != NULL )
			_stprintf( lpszError,_T("socket failed\n") );
		
		return INVALID_SOCKET;
	}

	ZeroMemory( &si_server,sizeof(struct sockaddr_in) );	//Bind socket
	si_server.sin_family = AF_INET;
	si_server.sin_addr.s_addr = htonl( INADDR_ANY );
	si_server.sin_port = htons( (u_short)nPort );

	if( bind( hSocket,(struct sockaddr*)&si_server,
		sizeof(struct sockaddr_in) ) != 0 )
	{
		if( lpszError != NULL )
			_stprintf( lpszError,_T("bind failed\n") );

		return INVALID_SOCKET;
	}

	if( listen( hSocket,SOMAXCONN ) != 0 )					//Listen
	{
		if( lpszError != NULL )
			_stprintf( lpszError,_T("listen failed\n") );

		return INVALID_SOCKET;
	}
	
	return hSocket;
}

void TerminateSrvSocket(SOCKET hSocket)
{
	WSACancelBlockingCall();

	if( hSocket != INVALID_SOCKET )
		closesocket( hSocket );
}

int ReadFromSocket(SOCKET hSocket,char* szBuf,UINT nSize,char* szError)
{
	int	rv = recv( hSocket,szBuf,nSize,0 );

	if( (rv < 0) && (szError != NULL) )
		_stprintf( szError,_T("recv failed!\n") );

	return rv;
}

BOOL SendToSocket(SOCKET hSocket,char* szBuf,UINT nSize,char* szError)
{
	int		sd; 

	while( (sd = send( hSocket,szBuf,nSize,0 )) != (int)nSize )
	{
		if( sd == SOCKET_ERROR )
		{
			if( szError != NULL )
				_stprintf( szError,_T("send failed!Error Code: %d\n"),WSAGetLastError() );
			return FALSE;
		}
		nSize -= sd;
		szBuf += sd;
	}

	return TRUE;
}

char*	GetLocalIP(void)
{
	TCHAR			szHost[MAX_PATH];
	struct hostent*	lpHost;
	struct in_addr	host_addr;

	if( gethostname( szHost,MAX_PATH ) == 0 )
	{
		lpHost = gethostbyname( szHost );
		if( lpHost != NULL )
		{
			memcpy( &host_addr.s_addr,lpHost->h_addr_list[0],sizeof(struct in_addr) );
			return inet_ntoa( host_addr );
		}
	}

	return NULL;
}

BOOL GetSocketIP(const SOCKET s,LPTSTR lpszSockIP,int nSize)
{
	struct sockaddr_in	name;
	int					namelen = sizeof(struct sockaddr_in);
	LPTSTR				lpszIP;
#ifdef	_UNICODE
	LPSTR				lpszUnicodeIP;
	int					nLenIP;
#endif
	
	ZeroMemory( lpszSockIP,nSize );
	if( getpeername(s,(struct sockaddr*)&name,&namelen) != 0 )
		return FALSE;

	lpszIP = inet_ntoa( name.sin_addr );
	if( strlen(lpszIP) >= (size_t)nSize )
		return FALSE;

	strcpy( (char*)lpszSockIP,lpszIP );

#ifdef	_UNICODE
	nLenIP = MultiByteToWideChar( CP_ACP,0,(LPCSTR)lpszSockIP,-1,NULL,0 );
	if( nLenIP * sizeof(WCHAR) > nSize )
		return FALSE;
	lpszUnicodeIP = HeapAlloc( GetProcessHeap(),0,nLenIP * sizeof(WCHAR) );
	if( lpszUnicodeIP == NULL )
		return FALSE;
	MultiByteToWideChar( CP_ACP,0,lpszSockIP,-1,lpszUnicodeIP,nLenIP );
	_tcscpy( lpszIP,lpszUnicodeIP );
	HeapFree( GetProcessHeap(),lpszUnicodeIP );
#endif
	
	return TRUE;
}

⌨️ 快捷键说明

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