map<SOCKET, ClientInfo>
因为调用accept返回的SOCKET其实就是int
//服务端://服务器接受线程数据
UINT CTcpSrvDlg::ReThreadFunc(LPVOID lParam)
{
CTcpSrvDlg *pDlgSrv = (CTcpSrvDlg*)lParam
WORD wVersionRequested//当前网络Socket版本号
WSADATA wsaData//定义当前网络信息对象
int err
int iError
CString str
wVersionRequested = MAKEWORD( 1, 1 )//(1.1)版本
//===1、初始化网络设备环境===
err = WSAStartup( wVersionRequested, &wsaData )
//如果WSAStartup返回值为0,则初始化成功
if ( err != 0 )
{
return 1L
}
//如果网络环境版本不对应,则清空网络设备环境并结束当前线程
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
AfxMessageBox("版本不匹配")
//清空网络设备环境
::WSACleanup()
return 1L
}
//===2、加载套接字===
SOCKET socketSvr = ::socket(AF_INET/*通信区域*/, SOCK_STREAM/*数据流式——TCP*/, 0)
if (INVALID_SOCKET == ::WSAGetLastError())
{
AfxMessageBox("加载套接字失败")
::WSACleanup()
::closesocket(socketSvr)
return 1L
}
//===3、套接字绑定
//初始化当前主机地址信息结构体对象
SOCKADDR_IN addSrv
addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY)//允许任何IP的主机与之相连
addSrv.sin_family = AF_INET//通信网际域
addSrv.sin_port = htons(7000)//0——65355端口,自定义要大一些>1000
iError = ::bind(socketSvr, (SOCKADDR*)&addSrv, sizeof(SOCKADDR_IN))
//校验是否绑定成功
if (SOCKET_ERROR == iError)
{
AfxMessageBox("套接字绑定失败")
::WSACleanup()
::closesocket(socketSvr)
return 1L
}
//===监听===
iError = ::listen(socketSvr, SOMAXCONN/*等待连接堆内的最大来访者个数,
如果设置为SOMAXCONN,
则下层的服务提供者负责将套接字设置backlog值为最大的合理的值。*/
)
if (SOCKET_ERROR == iError)
{
AfxMessageBox("监听失败")
::WSACleanup()
::closesocket(socketSvr)
return 1L
}
//===5、接受请求的客户机的套接字信息===
SOCKET sockClient
SOCKADDR_IN addrClient
int iAddrLen = sizeof(SOCKADDR_IN)
while (1)
{
//接受对方的套接字信息
::accept(socketSvr/*服务器接受*/, (SOCKADDR*)&addrClient, &iAddrLen)
//===6、接受客户端发过来的数据===
char recvBuf[100]
iError = ::recv(sockClient, recvBuf, 100, 0)
if(SOCKET_ERROR == iError)
{
AfxMessageBox("数据接受失败")
}
//将接受过来的数据显示ListBox中
str.Format("%s",recvBuf)
pDlgSrv->m_lbRecv.AddString(str)
}
::closesocket(socketSvr)
::WSACleanup()
return 1L
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)