資源簡介
一個socket對應多個client,每個socket開啟一個新的線程。可直接使用。

代碼片段和文件信息
#include?“client.h“
#include?
struct?_INI
{
? TCHAR?ServerIP[256];
int?ServerPort;
?
}X;
//變量
SOCKET sClient; //套接字
HANDLE hThreadSend; //發送數據線程
HANDLE hThreadRecv; //接收數據線程
char????bufSend[MAX_NUM_BUF]; //發送數據緩沖區
BOOL????bSend?=?FALSE;??????????????????????//發送標記位
BOOL bConnecting; //與服務器的連接狀態
HANDLE arrThread[2]; //子線程數組
CRITICAL_SECTION?cs; //臨界區對象,鎖定bufSend
/**
?* 初始化
?*/
BOOL?InitClient(void)
{
//初始化全局變量
InitMember();
//創建SOCKET
if?(!InitSockt())
{
return?FALSE;
}
return?TRUE;
}
/**
?*?初始化全局變量
?*/
void?InitMember(void)
{
InitializeCriticalSection(&cs);
sClient?=?INVALID_SOCKET; //套接字
????hThreadRecv?=?NULL; //接收數據線程句柄
hThreadSend?=?NULL; //發送數據線程句柄
bConnecting?=?FALSE; //為連接狀態
????//初始化數據緩沖區
memset(bufSend?0?MAX_NUM_BUF);
memset(arrThread?0?2);
}
/**
?*?創建非阻塞套接字
?*/
BOOL??InitSockt(void)
{
int reVal; //返回值
WSADATA wsData; //WSADATA變量
reVal?=?WSAStartup(MAKEWORD(22)&wsData);//初始化Windows?Sockets?Dll
//創建套接字
sClient?=?socket(AF_INET?SOCK_STREAM?0);
if(INVALID_SOCKET?==?sClient)
return?FALSE;
//設置套接字非阻塞模式
unsigned?long?ul?=?1;
reVal?=?ioctlsocket(sClient?FIONBIO?(unsigned?long*)&ul);
if?(reVal?==?SOCKET_ERROR)
return?FALSE;
return?TRUE;
}
BOOL?ReadConfig()
{
TCHAR?IniPath[256]?=?{0};
//CString?strInfo?=?NULL;
GetModuleFileName(NULLIniPath256);
INT32?len?=?strlen(IniPath);
INT32?nTemp?=?0;
TCHAR?tempBuf[256]?=?{0};
IniPath[len?-?3]?=?‘i‘;
IniPath[len?-?2]?=?‘n‘;
IniPath[len?-?1]?=?‘i‘;
?
? GetPrivateProfileString(“SET“?“ServerIP“?““?X.ServerIP?_countof(X.ServerIP)IniPath);
X.ServerPort?=?GetPrivateProfileInt(“SET““ServerPort“1000IniPath);
? return?TRUE;
}
/**
?*?連接服務器
?*/
BOOL?ConnectServer(void)
{
ReadConfig();
int?reVal; //返回值
sockaddr_in?serAddr;//服務器地址
//輸入要連接的主機地址
????serAddr.sin_family?=?AF_INET;
???//?serAddr.sin_port?=?htons(SERVERPORT);
serAddr.sin_port?=?htons(X.ServerPort);
???//?serAddr.sin_addr.S_un.S_addr?=?inet_addr(SERVERIP);addrSrv.sin_addr.S_un.S_addr=inet_addr((?char?*)X.HostPC_IP);
serAddr.sin_addr.S_un.S_addr?=?inet_addr((?char?*)X.ServerIP);
while(true)
{
//連接服務器
reVal?=?connect(sClient?(struct?sockaddr*)&serAddr?sizeof(serAddr));
//處理連接錯誤
if(SOCKET_ERROR?==?reVal)
{
int?nErrCode?=?WSAGetLastError();
if(?WSAEWOULDBLOCK?==?nErrCode?||?WSAEINVAL?==?nErrCode)????//連接還沒有完成
{
continue;
}
else?if?(WSAEISCONN?==?nErrCode)//連接已經完成
{
break;
}
else//其它原因,連接失敗
{
printf(“\nerror=%ld“nErrCode);
// return?FALSE;
}
}
if?(?reVal?==?0?)//連接成功
break;
}
bConnecting?=?TRUE;
return?TRUE;
}
/**
?*?創建發送和接收數據線程
?*/
BOOL CreateSendAndRecvThread(void)
{
//創建接收數據的線程
unsigned?long?ulThreadId;
hThreadRecv?=?CreateThread(NULL?0?RecvDataThread?NULL?0?&ulThreadId);
if?(NULL?==?hThreadRecv)
return?FALSE;
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????251392??2018-05-03?13:46??client\Release\socket_client.exe
?????文件?????????75??2018-05-07?09:57??client\Release\socket_client.ini
?????文件???????6618??2018-05-03?10:43??client\socket_client\client.cpp
?????文件???????1025??2018-05-03?13:46??client\socket_client\client.h
?????文件???????1692??2018-04-23?08:47??client\socket_client\ReadMe.txt
?????文件????????396??2018-04-23?08:47??client\socket_client\Resource.h
?????文件???????1020??2018-04-26?09:46??client\socket_client\socket_client.cpp
?????文件?????????39??2018-04-23?08:47??client\socket_client\socket_client.h
?????文件???????1373??2018-04-23?08:47??client\socket_client\socket_client.rc
?????文件???????4850??2018-04-26?08:58??client\socket_client\socket_client.vcproj
?????文件????????218??2018-04-23?08:47??client\socket_client\stdafx.cpp
?????文件????????813??2018-04-23?08:47??client\socket_client\stdafx.h
?????文件???????1026??2018-04-23?08:47??client\socket_client\targetver.h
?????文件????????905??2018-04-23?08:47??client\socket_client.sln
????..A..H.?????35328??2018-05-03?10:39??client\socket_client.suo
?????文件?????270336??2018-05-16?08:43??server\Release\Socket_Server.exe
?????文件?????????75??2018-04-26?10:10??server\Release\Socket_Server.ini
?????文件????6220800??2018-05-16?08:43??server\Release\Socket_Server.pdb
?????文件???????1692??2018-04-23?08:42??server\Socket_Server\ReadMe.txt
?????文件????????396??2018-04-23?08:42??server\Socket_Server\Resource.h
?????文件???????4085??2018-04-26?14:48??server\Socket_Server\sclient.cpp
?????文件???????1834??2018-04-23?08:45??server\Socket_Server\sclient.h
?????文件??????15422??2018-05-16?08:42??server\Socket_Server\server.cpp
?????文件???????2542??2018-05-02?10:46??server\Socket_Server\server.h
?????文件???????1399??2018-05-04?18:01??server\Socket_Server\Socket_Server.cpp
?????文件?????????39??2018-04-23?08:42??server\Socket_Server\Socket_Server.h
?????文件???????1373??2018-04-23?08:42??server\Socket_Server\Socket_Server.rc
?????文件???????4913??2018-05-16?08:28??server\Socket_Server\Socket_Server.vcproj
?????文件????????218??2018-04-23?08:42??server\Socket_Server\stdafx.cpp
?????文件????????813??2018-04-23?08:42??server\Socket_Server\stdafx.h
............此處省略12個文件信息
- 上一篇:SiamFC++.pptx
- 下一篇:數據結構C++語言進出堆棧動畫
評論
共有 條評論