MFC实现多个客户端连接服务器。tcp协议

MFC实现多个客户端连接服务器。tcp协议,第1张

服务器接收多个客户端链接,可以把客户端标识保存在map中

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

}

那样肯定是不行的,在一个局域网内,每一个主机的ip都是固定并已知的。在不同的局域网之间进行数据通信需要路由或网关才可以,QQ实现好友通信是因为我们并不是直接与对方连接的,我们发给对方的数据需要通过腾讯公司的服务器转发给对方。如果你细心观察就会发现,你在与你的朋友进行QQ通信之前,需要先登录QQ,而这个时候其实是连接到腾讯公司的服务器上。当我们给好友发信息的时候,信息会先到达腾讯公司的服务器上,再从腾讯公司的服务器上转发到好友那里。如果没有腾讯公司的服务器做为桥梁,任何两个在不同的局域网里面的两个QQ是没法进行通信的。要了解这些,建议你去看一看TCP/ip协议的书籍。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/296004.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-25
下一篇2023-04-25

发表评论

登录后才能评论

评论列表(0条)

    保存