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

📄 yes.cpp

📁 Cisco CVP 的Call Serve与第3方CTI的通信协议
💻 CPP
字号:
#include "stdafx.h"
#include "yes.h"

bool InitSocket()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD( 2, 2 );

	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 )
	{
		return false;
	}
	return true;	
}

void UnInitSocket()
{
	WSACleanup();
}

SOCKET MakeServeSocket(short port,u_int msgid,HWND hwnd)
{
	SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock==INVALID_SOCKET) return NULL;
	sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_port=htons(port);
	addr.sin_addr.s_addr=htonl(INADDR_ANY);
	int ret=bind(sock,(const sockaddr*)&addr,sizeof(SOCKADDR));
	if(ret==SOCKET_ERROR)
	{
		closesocket(sock);
		return NULL;
	}
	int iErrorCode=WSAAsyncSelect(sock,hwnd, msgid, FD_ACCEPT); 
	ret=listen(sock,5);
	if(ret==SOCKET_ERROR)
	{
		closesocket(sock);
		return NULL;
	}
	return sock;
}

SOCKET MakeServeSocket(short port)
{
	SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock==INVALID_SOCKET) return NULL;
	sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_port=htons(port);
	addr.sin_addr.s_addr=htonl(INADDR_ANY);
	int ret=bind(sock,(const sockaddr*)&addr,sizeof(SOCKADDR));
	if(ret==SOCKET_ERROR)
	{
		closesocket(sock);
		return NULL;
	}
	ret=listen(sock,5);
	if(ret==SOCKET_ERROR)
	{
		closesocket(sock);
		return NULL;
	}
	return sock;
}

SOCKET AcceptSocket(SOCKET sock,sockaddr FAR * addr)
{
	int nLengthAddr = sizeof(SOCKADDR);
	SOCKET m_hSocket = accept(sock, addr, &nLengthAddr);
	return m_hSocket;
}

SOCKET ConnectSocket(char* host,short port)
{
	SOCKET client=socket(AF_INET,SOCK_STREAM,0);
	if(client==INVALID_SOCKET) return NULL;
	sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_addr.s_addr=inet_addr(host);
	addr.sin_port=htons(port);
	int ret=connect(client,(const sockaddr*)&addr,sizeof(SOCKADDR));
	if(ret==SOCKET_ERROR)
	{
		closesocket(client);
		return NULL;
	}
	return client;
}

int SendSocket (SOCKET s, const char FAR * buf, int len, int nSecs)
{
	CString key;
	key.Format("send%u",s);
	HANDLE evt=CreateEvent(NULL,FALSE,TRUE,key);
	WaitForSingleObject(evt,INFINITE);
	int index=0;
	int count=0;
	while(index<len)
	{
		
		if(nSecs>0)
		{
			FD_SET fd = {1, s};
			TIMEVAL tv = {nSecs, 0};
			if(select(0, NULL, &fd, NULL, &tv) !=1)
			{
				SetEvent(evt);
				CloseHandle(evt);
				return SOCKET_ERROR;	
			}
		}
		count=send(s,buf+index,len-index,0);
		if(count<=0)
		{
			int ret=WSAGetLastError();	
			SetEvent(evt);
			CloseHandle(evt);
			return SOCKET_ERROR;
		}
		else
		{
			index+=count;			
		}
	}
	SetEvent(evt);
	CloseHandle(evt);
	return index;
}

int RecieveSocket(SOCKET client,int length,char* buffer,int nSecs,char* terchar)
{

	CString key;
	key.Format("recv%u",client);
	HANDLE evt=CreateEvent(NULL,FALSE,TRUE,key);
	WaitForSingleObject(evt,INFINITE);
	int index=0;
	int count=0;
	while(index<length)
	{

		if(nSecs>0)
		{
			FD_SET fd = {1, client};
			TIMEVAL tv = {nSecs, 0};
			if(select(0, &fd, NULL, NULL, &tv) !=1)
			{
				SetEvent(evt);
				CloseHandle(evt);
				return SOCKET_ERROR;		
			}
		}
		count=recv(client,buffer+index,length-index,0);
		if(count<=0)
		{
			int ret=WSAGetLastError();	
			SetEvent(evt);
			CloseHandle(evt);
			return SOCKET_ERROR;
		}
		else
		{
			index+=count;
			if(terchar)
			{
				if(strncmp(buffer+index-strlen(terchar),terchar,strlen(terchar))==0)
				{
					SetEvent(evt);
					CloseHandle(evt);
					return index;
				}
			}
		}
	}
	SetEvent(evt);
	CloseHandle(evt);
	return index;
}

void CloseSocket(SOCKET sock)
{
	CString keyrecv;
	keyrecv.Format("recv%u",sock);
	HANDLE evtrecv=CreateEvent(NULL,FALSE,TRUE,keyrecv);
	
	CString keysend;
	keysend.Format("send%u",sock);
	HANDLE evtsend=CreateEvent(NULL,FALSE,TRUE,keysend);

	WaitForSingleObject(evtrecv,INFINITE);

	WaitForSingleObject(evtsend,INFINITE);
	
	closesocket(sock);

	SetEvent(evtsend);
	CloseHandle(evtsend);

	SetEvent(evtrecv);
	CloseHandle(evtrecv);
}

⌨️ 快捷键说明

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