本文截选了主要的代码片段,供学习参考之用,如有错误,恳请提出或指正,在此表示感谢!
截选代码及实现过程( MFC 版)
Server 端:
// 初始化 ws2.dll 动态库;
if (!AfxSocketInit (&wsadt ))
MessageBox (lpInitError ,NULL ,MB_OK | MB_ICONSTOP );
// 创建 socket ;
g_ServerSocket = new CSocket ;
ServerSocket = socket (AF_INET ,SOCK_STREAM ,IPPROTO_TCP );
if ( ServerSocket == INVALID_SOCKET )
{
iError = WSAGetLastError ();
}
g_ServerSocket ->Attach (ServerSocket );
// 绑定 secket ;
serverService .sin_family = AF_INET ;
serverService .sin_port = htons (3088); //this value must be same as client;
serverService .sin_addr .s_addr = inet_addr("127.0.0.1"); // for testing; memset (serverService .sin_zero ,0,8);
g_ServerSocket ->Bind ((SOCKADDR *) &serverService , sizeof (SOCKADDR ));
// 发送数据;
returnValue = g_AcceptSocket ->Send (wBuffer ,lenth *sizeof (WCHAR ),0);
PostMessage (WM_MYMSG_CHAT ,NULL ,NULL );//continue to receive data ;
// 接收数据 ;
strLength = g_AcceptSocket ->Receive ((char *)wBuffer ,BUFLEN ,0);
Client 端
// 初始化 ws2.dll
if (!AfxSocketInit (&wsadt ))
MessageBox (lpInitError ,NULL ,MB_OK | MB_ICONSTOP );
// 创建 socket;
g_ClientSocket = new CSocket ;
ClientSocket = socket (AF_INET ,SOCK_STREAM ,IPPROTO_TCP );
if ( ClientSocket == INVALID_SOCKET )
{
iError = WSAGetLastError ();
}
flg = g_ClientSocket ->Attach (ClientSocket );
// 连接服务端;
serverService .sin_family = AF_INET ;
serverService .sin_port = htons (30 6 8); //this value must be same with server;
memset (serverService .sin_zero ,0,8);
hstent = gethostbyname (servernm );//resolve the name of host;
serverService .sin_addr = *((struct in_addr *)hstent ->h_addr );
strcpy_s (cSvNm ,hstent ->h_name );
if (!g_ClientSocket ->Connect ((SOCKADDR *) &serverService , sizeof (SOCKADDR )))
{
iError = WSAGetLastError ();
}
// 发送数据;
g_ClientSocket ->Send (wBuf ,lenth *sizeof (WCHAR ),0);
// 接收数据;
g_ClientSocket -> Receive (lpBuf , nBufLen 0);
目前实现情况
已经实现一对一聊天,一问一答的过程,当然这是最简单的;接下来,考虑添加线程操作,使得两端的收发可以同时进行;其次,考虑多clients聊天的实现。