亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcp.cpp

?? TCP網絡傳輸
?? CPP
字號:
// TCP.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "TCP.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define  CLIENET_MAGIC_WORD   300 //客戶端校驗位
#define  SERVER_MAGIC_WORD    500 //服務端校驗位

BEGIN_MESSAGE_MAP(CTCPApp, CWinApp)
	//{{AFX_MSG_MAP(CTCPApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTCPApp construction

CTCPApp::CTCPApp()
{
	this->m_list.clear();
}

CTCPApp::~CTCPApp()
{
	this->m_list.clear();
}

BOOL CTCPApp::RemoveList(int handle)
{
	THREAD td;
	for(THREAD_LIST::iterator itr = this->m_list.begin(); itr != this->m_list.end();itr++)
	{
		td = *itr;
		if(td.s == handle)
		{
			this->m_list.erase(itr); return TRUE;
		}
	}
	return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CTCPApp object

CTCPApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CTCPApp initialization
//開始進入dll
BOOL CTCPApp::InitInstance()
{
	if (!AfxSocketInit())
	{
		CString msg;
		msg.LoadString(IDP_SOCKETS_INIT_FAILED);
		return MessageBox(NULL,msg + "\r\n\r\n按確定退出程序","賽力科技",MB_ICONSTOP | MB_OK) !=IDOK;
	}
	return TRUE;
}
//退出進入dll
int CTCPApp::ExitInstance() 
{
	THREAD_LIST::iterator itr;
	while(!this->m_list.empty())
	{
		itr = this->m_list.begin();//取第一個值
	    ::closesocket((*itr).s);//關閉socket
		::WaitForSingleObject((*itr).hThread,INFINITE);//等待線程結束
		this->m_list.erase(itr);
	}
	return CWinApp::ExitInstance();
}
//服務器收到一個連接
DWORD WINAPI CTCPApp::OnAccept(void *wParam)
{
	INFO *info =(INFO *)wParam;
	sockaddr_in addr;
	int len=sizeof(addr);

	for(;;)
	{
		SOCKET as = ::accept(info->s,(SOCKADDR *)&addr,&len);
		if(as < 0)//出錯
			break;
		else //連接成功。通過回調函數告訴程序有新的連接連上
		{
			INFO *in = new INFO;//為每一個新連接的socket重定義信息
			ASSERT(in != NULL);
			in->Receive = info->Receive;//接收線程
			in->s = as;//新連接的socket
			in->wParam = info->wParam;//用戶自定義的參數
			//啟動線程進行監聽連接
			THREAD thread;
			DWORD id;
			thread.hThread = ::CreateThread(NULL,NULL,CTCPApp::Server,in,0,&id);
			thread.s = as;
			theApp.m_list.push_back(thread);//保留線程句柄和該線程函數的socket
		}
	}
	theApp.RemoveList(info->s); 
	closesocket(info->s);
	delete info;
	::ExitThread(0);
	return 0;
}
//服務器接收線程
DWORD WINAPI CTCPApp::Server(void *wParam)
{
	INFO *info =(INFO *)wParam;
	ASSERT(info->Receive != NULL);
    //驗證 ==>> 三秒
	struct timeval time = {3,0};
	fd_set fd;
	FD_ZERO(&fd);
	FD_SET(info->s,&fd);
	DWORD magic = SERVER_MAGIC_WORD;//服務端

    if(::select(0,NULL,&fd,NULL,&time) < 0 || //最長等待3秒鐘
		::send(info->s,(char *)&magic,sizeof(DWORD),0) != sizeof(DWORD))//發送出錯
	{ 
		::closesocket(info->s); goto end;
	}
	if(::select(0,&fd,NULL,NULL,&time) < 0 || //最長等待三秒鐘
		::recv(info->s,(char *)&magic,sizeof(DWORD),0) != sizeof(DWORD) || //接收出錯
	    magic != CLIENET_MAGIC_WORD) //校驗位不對
	{
		::closesocket(info->s); goto end;
	} 
	//外部循環工作,返回true則關閉socket
	if(info->Receive(info->wParam,info->s))
		::closesocket(info->s);
	
end://退出工作
	theApp.RemoveList(info->s); 
	delete info;
	::ExitThread(0); 
	return TRUE;
}
//客戶端接收線程
DWORD WINAPI CTCPApp::Client(void *wParam)
{
	INFO *info =(INFO *)wParam;
	ASSERT(info->Receive != NULL);
	//外部循環工作.如果返回true則關閉socket
	if(info->Receive(info->wParam,info->s))
		::closesocket(info->s);
	//退出工作
	theApp.RemoveList(info->s);
	delete info;
	::ExitThread(0);
	return TRUE;
}

//服務端,開始創建服務器
extern "C" __declspec(dllexport) TCPHANDLE CreateTCP(BOOL (*OnServer)(void *wParam,TCPHANDLE handle),//進到線程后的工作
													 void *wParam,
													 const int port)
{
	ASSERT( OnServer != NULL && wParam != NULL);//要保證回調函數不能為空
	ASSERT( port > 0);//端口號要大于零
		
	sockaddr_in addr;
	addr.sin_addr.s_addr = INADDR_ANY;
	addr.sin_family=AF_INET;
	addr.sin_port=::htons(port); 
    //創建套接字
    SOCKET s = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(s == INVALID_SOCKET)
	{
		MessageBox(NULL,"創建套接字失敗","賽力科技",MB_ICONSTOP|MB_OK);
		return INVALID_SOCKET;
	}
	//綁定套接字
	if(::bind(s,(SOCKADDR *)&addr,sizeof(addr)) == SOCKET_ERROR)
	{
		MessageBox(NULL,"綁定套接字失敗","賽力科技",MB_ICONSTOP|MB_OK);
		closesocket( s ); return INVALID_SOCKET;
	}
	//監聽套接字
	if(::listen(s,5)==SOCKET_ERROR)
	{
		MessageBox(NULL,"監聽套接字失敗","賽力科技",MB_ICONSTOP|MB_OK);
		closesocket( s ) ;return INVALID_SOCKET;
	}
	//保存用戶回調函數的信息
	INFO *info = new INFO;
    info->s = s;
	info->Receive = OnServer;
	info->wParam = wParam;
    //啟動線程進行監聽連接
	THREAD thread;
	DWORD id;
	thread.hThread = ::CreateThread(NULL,NULL,CTCPApp::OnAccept,info,0,&id);
	thread.s = s;
	theApp.m_list.push_back(thread);//保留線程句柄和該線程函數的socket
    return s;
}
//客戶端連接
extern "C" __declspec(dllexport) TCPHANDLE ConnectTCP(BOOL (*OnClient)(void *wParam,TCPHANDLE handle),
													  void *wParam,
													  LPCSTR ip,
													  const int port)
{
	ASSERT( ip != NULL && port > 0);

	sockaddr_in addr;
	addr.sin_addr.s_addr=::inet_addr(ip);
	addr.sin_family=AF_INET;
	addr.sin_port=::htons(port); 
    //創建套接字
	SOCKET s = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(s == INVALID_SOCKET)
	{
		MessageBox(NULL,"創建套接字失敗","賽力科技",MB_ICONSTOP|MB_OK);
		return INVALID_SOCKET;
	}
    //連接
	if(::connect(s,(SOCKADDR *)&addr,sizeof(addr)) == SOCKET_ERROR)
	{
		MessageBox(NULL,"連接服務器失敗","賽力科技",MB_ICONSTOP|MB_OK);
		closesocket(s);return INVALID_SOCKET;
	}
	//驗證 ==>> 三秒
	struct timeval time = {3,0};
	fd_set fd;
	FD_ZERO(&fd);
	FD_SET(s,&fd);
	DWORD magic = CLIENET_MAGIC_WORD;//客戶端

    if(::select(0,NULL,&fd,NULL,&time) < 0 || //最長等待3秒鐘
		::send(s,(char *)&magic,sizeof(DWORD),0) != sizeof(DWORD))
	{ 
		MessageBox(NULL,"連接上了非法的服務器","賽力科技",MB_ICONSTOP|MB_OK);
		closesocket(s); return INVALID_SOCKET;
	}
	if(::select(0,&fd,NULL,NULL,&time) < 0 || //最長等待三秒鐘
		::recv(s,(char *)&magic,sizeof(DWORD),0) != sizeof(DWORD) || //接收出錯
	    magic != SERVER_MAGIC_WORD) //校驗位不對
	{
		MessageBox(NULL,"連接上了非法的服務器","賽力科技",MB_ICONSTOP|MB_OK);
		closesocket(s); return INVALID_SOCKET;
	}
	//如果客戶端要接收數據
	if(OnClient)
	{
		INFO *info = new INFO;
		ASSERT(info != NULL);
		info->Receive = OnClient;
		info->wParam = wParam;
		info->s = s;
        //啟動線程
		THREAD thread;
		DWORD id;
		thread.hThread = ::CreateThread(NULL,NULL,CTCPApp::Client,info,0,&id);
		thread.s = s;
		theApp.m_list.push_back(thread);//保留線程句柄和該線程函數的socket
	}
	return s;
}
//發送
extern "C" __declspec(dllexport) BOOL  SendTCP(TCPHANDLE handle,char *buffer,struct timeval *timeout = NULL)
{
	DWORD size = *(DWORD *)buffer;//頭四個字節表明包的長度,包括四個字節
	fd_set fd;
	FD_ZERO(&fd);FD_SET(handle,&fd);
	UINT send_size=0;
	while(send_size < size)
		if(::select(0,NULL,&fd,NULL,timeout) > 0)
		{
			int ret=::send(handle,buffer + send_size,size - send_size,0); 
			if( ret <= 0 )  
				break;
			send_size += ret;
		}
		else
			break;
	if(send_size < size) ::closesocket(handle);//發送錯誤,關閉socket
	return send_size >= size;
}
//接收,包的長度是前四個字節。包括四個字節占的空間
extern "C" __declspec(dllexport) BOOL ReceiveTCP(TCPHANDLE handle,char *buffer,struct timeval *timeout = NULL)
{
	DWORD len = 0;
	DWORD recv_length = sizeof(DWORD);//已經讀取了四個字節的長度

	fd_set fd;
	FD_ZERO(&fd);
	FD_SET(handle,&fd);
	if( ::select(0,&fd,NULL,NULL,timeout) > 0 )
	{
		int ret=::recv(handle,buffer,sizeof(DWORD),0);
		if(ret == sizeof(DWORD))//讀取頭4個字節。表明包的長度
		{
			len=*(DWORD *)buffer;//讀取4字節判斷包的長度
			while( len > recv_length )
			{
				int ret = ::recv( handle , buffer + recv_length , len - recv_length , 0 );
				if( ret <= 0 ) //接收過程中出錯
					break;
				recv_length += ret;
			}
		}
	}
	if(len == 0 || recv_length < len) ::closesocket(handle);//接收錯誤,關閉socket
	return len && recv_length >= len;
}
//從一個已經連接的socket得到服務器的ip地址
extern "C" __declspec(dllexport) char * GetHostIPAddr(TCPHANDLE handle)
{
	sockaddr_in addr;
	int len = sizeof(addr);
	::getpeername(handle,(SOCKADDR *)&addr,&len);
	return ::inet_ntoa(addr.sin_addr);
}
//從一個已經連接好的socket得到本機ip地址
extern "C" __declspec(dllexport) char *GetLocalIPAddr(TCPHANDLE handle)
{
	sockaddr_in addr;
	int len = sizeof(addr);
	::getsockname(handle,(SOCKADDR *)&addr,&len);
	return ::inet_ntoa(addr.sin_addr);
}
//關閉tcp的socket
extern "C" __declspec(dllexport) BOOL CloseTCP(void *handle)
{
	TCPHANDLE *h = (TCPHANDLE *)handle;
	closesocket(*h); *h = -1;
	return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人影视亚洲图片在线| 日本美女一区二区| 国产精品久久久久久久久免费樱桃| 欧美一级片在线观看| 欧美性猛片aaaaaaa做受| 日本久久电影网| 91久久精品一区二区三| 一本久久精品一区二区| 色综合中文字幕国产 | 成人网在线播放| 成人综合婷婷国产精品久久蜜臀| 国产成人精品一区二区三区网站观看 | 亚洲精品日日夜夜| 亚洲一区免费观看| 亚洲国产一区二区三区 | 色综合中文字幕国产| 一本一道久久a久久精品| 色婷婷精品久久二区二区蜜臀av | www.99精品| 欧美亚洲国产一区二区三区va| 在线精品观看国产| 欧美二区三区91| 精品国产乱码久久久久久久 | 日本欧美在线看| 久国产精品韩国三级视频| 狠狠色丁香久久婷婷综合丁香| 国产一区二区三区精品视频| 成人国产在线观看| 在线中文字幕一区二区| 欧美一区二区三区在线看| 久久青草欧美一区二区三区| 国产精品国产精品国产专区不片| 一区二区三区四区蜜桃 | 成人国产精品免费观看| 欧美性猛交xxxxxx富婆| 欧美一二三四区在线| 久久久久综合网| 中文字幕日韩一区| 亚洲国产精品久久久久婷婷884 | 自拍视频在线观看一区二区| 亚洲午夜国产一区99re久久| 91丨porny丨在线| 欧美日韩免费视频| 国产婷婷一区二区| 亚洲一区二区三区国产| 韩国毛片一区二区三区| 99精品视频一区| 日韩午夜小视频| 亚洲日本免费电影| 六月丁香婷婷久久| 99精品国产99久久久久久白柏 | 亚洲四区在线观看| 人人狠狠综合久久亚洲| av一区二区久久| 日韩色在线观看| 国产精品国产精品国产专区不片| 日本最新不卡在线| 97se亚洲国产综合自在线不卡| 欧美久久一区二区| 国产精品国产三级国产普通话蜜臀 | 日韩一区精品视频| 99re8在线精品视频免费播放| 欧美一区二区三区在线看| √…a在线天堂一区| 麻豆极品一区二区三区| 91美女片黄在线观看91美女| 久久夜色精品国产噜噜av| 亚洲图片欧美一区| 成人av网站免费观看| 欧美大片顶级少妇| 久久精品国产99久久6| 国产亚洲精久久久久久| 麻豆一区二区99久久久久| 99久久99久久精品国产片果冻| 欧美人妇做爰xxxⅹ性高电影| 欧美激情综合网| 日本韩国一区二区| 26uuu亚洲综合色| 亚洲国产一区二区三区青草影视| 成人午夜伦理影院| 久久久亚洲综合| 美国精品在线观看| 色综合中文字幕国产| 久久视频一区二区| 美女一区二区三区| 欧美久久久久久久久| 夜夜嗨av一区二区三区| 91啪在线观看| 成人免费一区二区三区视频| 国产成人自拍高清视频在线免费播放 | 欧美影视一区二区三区| 中文字幕欧美一区| 成人久久视频在线观看| 久久久久久久久久久久久女国产乱| 日韩电影在线观看一区| 欧美日韩大陆一区二区| 一区二区三区四区在线| 91国在线观看| 亚洲免费在线看| 99视频精品免费视频| 日本一区二区三区国色天香| 国产美女视频91| 久久久久亚洲蜜桃| 久久97超碰色| 精品福利一区二区三区免费视频| 美女免费视频一区二区| 欧美电视剧免费全集观看| 蓝色福利精品导航| 欧美大片日本大片免费观看| 精品一区二区三区视频| 欧美tickling挠脚心丨vk| 精品在线免费视频| 亚洲精品在线三区| 国产成人综合视频| 国产精品久久久久久久久动漫| 成人久久久精品乱码一区二区三区| 国产精品理论在线观看| jlzzjlzz亚洲日本少妇| 亚洲一区二区三区四区在线观看| 欧美主播一区二区三区| 日本午夜一区二区| 26uuu精品一区二区在线观看| 国产成人免费视频网站| 老司机免费视频一区二区| 欧美白人最猛性xxxxx69交| 国产乱理伦片在线观看夜一区| 2023国产精华国产精品| 岛国av在线一区| 亚洲精品美国一| 91精品黄色片免费大全| 老司机精品视频在线| 国产精品天干天干在线综合| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 99精品国产热久久91蜜凸| 亚洲福利视频一区| 久久一区二区三区四区| 91网上在线视频| 免费人成在线不卡| 国产精品全国免费观看高清| 91国内精品野花午夜精品| 免费在线看成人av| 国产精品系列在线| 欧美日韩五月天| 国产精品888| 一区二区免费看| 26uuu亚洲婷婷狠狠天堂| 91免费在线播放| 日本成人在线看| 国产精品免费视频网站| 欧美人妇做爰xxxⅹ性高电影| 国产一区欧美二区| 亚洲国产欧美日韩另类综合| 精品电影一区二区三区| 色av一区二区| 国产一二精品视频| 亚洲v日本v欧美v久久精品| 国产性天天综合网| 欧美精品一二三区| 99精品1区2区| 国产在线精品一区在线观看麻豆| 亚洲精品成人在线| 高清不卡一区二区| 色婷婷久久久综合中文字幕| 7777精品伊人久久久大香线蕉超级流畅 | 国产精品久久久久久久岛一牛影视| 久久久久久久久久久久久久久99 | 午夜视频一区二区| 亚洲毛片av在线| 看电视剧不卡顿的网站| 色女孩综合影院| 国产欧美日本一区二区三区| 国产一二精品视频| 国产欧美精品区一区二区三区 | 91亚洲国产成人精品一区二区三 | 成人av手机在线观看| 欧美一级高清片| 色婷婷精品久久二区二区蜜臂av | 国产乱子伦视频一区二区三区 | 成人综合在线观看| 久久99久久精品| 亚洲va欧美va人人爽| 国产精品成人免费精品自在线观看 | 2020国产成人综合网| 欧美日韩中文一区| 99久久精品国产麻豆演员表| 精品一区二区三区av| 日本女人一区二区三区| 亚洲一区二区三区自拍| 综合激情成人伊人| 国产清纯白嫩初高生在线观看91 | 日韩欧美中文字幕精品| 欧美三级乱人伦电影| 91麻豆精品一区二区三区| 成人黄页在线观看| 成人在线综合网| 福利一区在线观看| 国产99久久久精品| 欧美日韩国产小视频在线观看| 91亚洲精品久久久蜜桃| 成人a级免费电影|