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