本来应该是基于消息的异步通信网络编程的,但是服务器端有些问题,服务端可以收到客户端的消息,但是客户端不能收到服务端的消息,所以异步暂时没实现,先把这个问题解决了再说。
基于TCP的点对点聊天系统, 服务端代码如下:
初始化:
这一段加进去就可
BOOL CMfcseverApp::InitInstance()
{
WORD wVersionRequest;
WSADATA wsadata;
wVersionRequest = MAKEWORD(2,2);
if(WSAStartup(wVersionRequest,&wsadata) != 0)
{
exit(0);
}
if((LOBYTE(wsadata.wVersion) != 2) || (HIBYTE(wsadata.wVersion) != 2))
{
WSACleanup();
exit(0);
}
}
建立本地套接字:这个是按钮点击触发
void CMfcseverDlg::OnBuildServer()
{
// TODO: Add your control notification handler code here
sockSrv = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);
if(SOCKET_ERROR == sockSrv)
{
exit(0);
}
SOCKADDR_IN sockaddr;
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(7000);
sockaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(sockSrv,(SOCKADDR *)&sockaddr,sizeof(sockaddr));//==SOCKET_ERROR);
{
exit(0);
}
if(SOCKET_ERROR == WSAAsyncSelect(sockSrv,m_hWnd,UM_SOCK,FD_READ | FD_WRITE | FD_ACCEPT | FD_CLOSE))
{
exit(0);
}
listen(sockSrv,5);
}
对注册的消息事件的处理:
void CMfcseverDlg::OnSock(WPARAM wparam, LPARAM lparam)
{
memset(sendbuf,0,100);
wsabuf.len = 100;
wsabuf.buf = sendbuf;
CString str_get;
int len=sizeof(SOCKADDR);
switch( WSAGETSELECTEVENT(lparam))//LOWORD(lparam)宏定义
{
case FD_CLOSE:
MessageBox("链接中断");
break;
case FD_ACCEPT:
m_subSrv = accept(sockSrv,(SOCKADDR *)&addrClient,&len);
break;
case FD_READ:
WSARecv(sockSrv,&wsabuf,1,&dwRead,&dwFlag,NULL,NULL);
str_Show +=wsabuf.buf;
str_Show+="/r/n";
str_Show+=str_get;
GetDlgItem(IDC_SHOW_CLIENT)->SetWindowText(str_Show);
break;
case FD_WRITE:
wsprintf(sendbuf,"welcome to our talk/n");//,inet_ntoa(addrClient.sin_addr));
wsabuf.buf = sendbuf;
wsabuf.len = 100;
WSASend(m_subSrv,&wsabuf,1,&dwRead,dwFlag,NULL,NULL);
break;
}
}
向客户端发送消息:
void CMfcseverDlg::OnSendmessage()
{
// TODO: Add your control notification handler code here
wsprintf(sendbuf,"aaaaaaaaaa");//,inet_ntoa(addrClient.sin_addr));
wsabuf.buf = sendbuf;
wsabuf.len = sizeof(sendbuf);
WSASend(m_subSrv,&wsabuf,10,&dwRead,dwFlag,NULL,NULL);
((CEdit *)GetDlgItem(IDC_SHOW_CLIENT))->SetSel(0,-1);
}
我用WSASend向客户端发信息的时候,客户端收不到,但是客户端可以收到服务端的消息,是不是FD_ACCEPT消息没有响应,所以m_subSrv这个成员变量没有值,发不出去呢?
或者服务端向客户端的不是这个函数。
在线等,愿意帮忙的可以联系,QQ154810376