📄 winsockex.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 + -