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

📄 sock.cpp

📁 本程序是实现中国移动中国联通的网关程序.代码比较完整.
💻 CPP
字号:
// sock.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "sock.h"
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif/*INADDR_NONE*/
#define portbase 0

SOCKET connectSock(const char* ,const char* ,const char*);
SOCKET passiveSock(const char* ,const char* ,int);

/*--------------------------------------------------------
*DllMain--entry to the dll
*-----------------------------------------------------*/



/*------------------------------------------------------
*connectTCP-create a tcp socket and connect to host
*------------------------------------------------------*/
SOCKET connectTCP(const char* host,const char* service)
{
	return connectSock(host,service,"tcp");
}
/*------------------------------------------------------
*connectUDP-create a udp socket and connect to host
*------------------------------------------------------*/
SOCKET connectUDP(const char* host,const char* service)
{
	return connectSock(host,service,"udp");
}
/*---------------------------------------------------------
*passivUDP-create a passive socket for use in a udp server
*----------------------------------------------------------*/
SOCKET passiveUDP(const char* service)
{
	return passiveSock(service,"udp",0);
}
/*---------------------------------------------------------
*passivTCP-create a passive socket for use in a tcp server
*----------------------------------------------------------*/
SOCKET passiveTCP(const char* service,int qlen)
{
	return passiveSock(service,"tcp",qlen);
}


/*--------------------------------------------------------
*connectSock--allocate & connect a tcp or udp socket
*-----------------------------------------------------*/

SOCKET connectSock(const char* host,const char* service,const char* protocol)
{
	struct hostent *phe;		//pointer to host information entry
	struct servent *pse;	//pointer to service information entry
	struct protoent *ppe;	//pointer to protocol information entry
	struct sockaddr_in sin;	//an internet endpoint address
	int s,type;				//socket descriptor and type

	memset(&sin,0,sizeof(sin));
	sin.sin_family=AF_INET;
	//map service name to port number
	if(pse=getservbyname(service,protocol))
		sin.sin_port=pse->s_port;
	else if((sin.sin_port=htons((u_short)atoi(service)))==0)
	{
		AddLog("Can't get \"%s\" service entry.\n",service);
		return -1;
	}
	//map the host name to ip address, allowing for dotted decimal.
	if(phe=gethostbyname(host))
		memcpy(&sin.sin_addr,phe->h_addr,phe->h_length);
	else if((sin.sin_addr.s_addr=inet_addr(host))==INADDR_NONE)
	{
		AddLog("Can't get \"%s\" host entry\n",host);
		return -1;
	}
	//map protocol name to protocol number.
	if((ppe=getprotobyname(protocol))==0)
	{
		AddLog("Can't get \"%s\" protocol entry\n",protocol);
		return -1;
	}
	//use protocol to choose a protocol type
	if(stricmp(protocol,"udp")==0)
		type=SOCK_DGRAM;
	else type=SOCK_STREAM;
	//allocate a socket
	s=socket(PF_INET,type,ppe->p_proto);
	if(s==INVALID_SOCKET)
	{
		AddLog("Can't create socket: %d\n",GetLastError());
		return INVALID_SOCKET;
	}
	//connect the socket
	if(connect(s,(struct sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
	{
		AddLog("Can't connect to %s.%s: %d\n",host,service,GetLastError());
		SleepEx(1000,1);
		return INVALID_SOCKET;
	}
	return s;
}
/*-------------------------------------------------------
*errexit-print an error message and exit
*--------------------------------------------------------*/
#if 0
//varargs1
void errexit(const char* format,...)
{
	va_list args;
	va_start(args,format);
	vfprintf(stderr,format,args);
	va_end(args);
	exit(1);
}
#endif
/*-------------------------------------------------------------
*passiveSock-allocate and bind a server socket using tcp or udp
*--------------------------------------------------------------*/

SOCKET passiveSock(const char* service,const char* protocol,int qlen)
{
	struct servent *pse;	//pointer to service information entry
	struct protoent *ppe;	//pointer to protocol information entry
	struct sockaddr_in sin;	//an internet endpoint address
	SOCKET s;
	int type;				//socket descriptor and type

	memset(&sin,0,sizeof(sin));
	sin.sin_family=AF_INET;
	sin.sin_addr.s_addr=INADDR_ANY;
	//map service name to port number
	if(pse=getservbyname(service,protocol))
		sin.sin_port=htons(ntohs((u_short)pse->s_port)+portbase);
	else if((sin.sin_port=htons((u_short)atoi(service)))==0)
	{
		AddLog("Can't get \"%s\" service entry.\n",service);
		return -1;
	}
	//map protocol name to protocol number.
	if((ppe=getprotobyname(protocol))==0)
	{
		AddLog("Can't get \"%s\" protocol entry\n",protocol);
		return -1;
	}
	//use protocol to choose a protocol type
	if(stricmp(protocol,"udp")==0)
		type=SOCK_DGRAM;
	else type=SOCK_STREAM;
	//allocate a socket
	s=socket(PF_INET,type,ppe->p_proto);
	if(s==INVALID_SOCKET)
	{
		AddLog("Can't create socket: %d\n",GetLastError());
		return -1;
	}
	setsockopt(s,IPPROTO_TCP,SO_REUSEADDR,(char*)1,4);
	//bind the socket
	if(bind(s,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR)
	{
		AddLog("Can't bind to %s port: %d\n",service,GetLastError());
		closesocket(s);
		return -1;
	}
	if(type==SOCK_STREAM&&listen(s,qlen)==SOCKET_ERROR)
		AddLog("Can not listen on %s port: %d\n",
		service,GetLastError());
	return s;
}

⌨️ 快捷键说明

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