MFC socket通信
服务器端程序程序代码:
BOOL CTCP_SERVER_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); // 省略若干代码 // TODO: 在此添加额外的初始化代码 addr.sin_family=AF_INET; addr.sin_port=htons(2978); addr.sin_addr.S_un.S_addr=INADDR_ANY; s=::socket(AF_INET,SOCK_STREAM,0); ::bind(s,(sockaddr*)&addr,sizeof(addr)); ::listen(s,5); GetDlgItem(IDC_TEXT)->EnableWindow(false); GetDlgItem(IDC_ADDR)->SetWindowText(_T("服务器监听已经启动!")); ::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } LRESULT CTCP_SERVER_MFCDlg::OnSocket(WPARAM wParam, LPARAM lParam) { CString str; char cs[100]={0}; MessageBox(_T("进入socket函数")); GetDlgItem(IDC_TEXT)->EnableWindow(true); switch(WSAGETSELECTEVENT(lParam)) { case FD_ACCEPT: { MessageBox(_T("进入accept函数")); int length=sizeof(addr1); s1=::accept(s,(sockaddr*)&addr1,&length); str.Format(_T("有1个客户已经连接上了")); GetDlgItem(IDC_TEXT)->SetWindowText(str); str+=::inet_ntoa(addr1.sin_addr); str+="登录\n"; GetDlgItem(IDC_TEXT)->SetWindowText(str); } break; case FD_READ: { MessageBox(_T("进入recv函数")); CString num; ::recv(s1,cs,100,0); GetDlgItem(IDC_TEXT)->GetWindowText(num); num+="\n"; num+=(LPTSTR)::inet_ntoa(addr1.sin_addr); num+="对您说:"; num+=(LPTSTR)cs; GetDlgItem(IDC_TEXT)->SetWindowText(num); } break; } return 0; } void CTCP_SERVER_MFCDlg::OnBnClickedSend() { // TODO: 在此添加控件通知处理程序代码 CString str; GetDlgItem(IDC_SENDTEXT)->GetWindowText(str); if(str==" ") MessageBox(_T("消息不能为空!")); else { if(::send(s1,(const char*)str.GetBuffer(1),sizeof(str),0)!=SOCKET_ERROR) { GetDlgItem(IDC_TEXT)->SetWindowText(_T("消息已经发送到客户端!\n")); GetDlgItem(IDC_TEXT)->GetWindowText(str); str+="\n"; GetDlgItem(IDC_TEXT)->SetWindowText(str); } else GetDlgItem(IDC_TEXT)->SetWindowText(_T("消息发送失败!\n")); } }
客服端程序
程序代码:
BOOL CTCP_CLIENT_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); // 省略若干程序 // TODO: 在此添加额外的初始化代码 GetDlgItem(IDC_SENDTEXT)->EnableWindow(false); GetDlgItem(IDC_SEND)->EnableWindow(false); s=::socket(AF_INET,SOCK_STREAM,0); ::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET, FD_READ); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CTCP_CLIENT_MFCDlg::OnBnClickedConnect() { // TODO: 在此添加控件通知处理程序代码 CString str,str1; int port; GetDlgItem(IDC_ADDR)->GetWindowText(str); GetDlgItem(IDC_PORT)->GetWindowText(str1); if(str==""||str1=="") { MessageBox(_T("服务器地址或端口不能为NULL")); } else { port=atoi((const char*)str1.GetBuffer(1)); addr.sin_family="127.0.0.1"; addr.sin_addr.S_un.S_addr=inet_addr((const char*)str.GetBuffer(1)); addr.sin_port=ntohs(port); GetDlgItem(IDC_TEXT)->SetWindowText(_T("正在连接服务器......\r\n")); if(::connect(s,(sockaddr*)&addr,sizeof(addr))) { GetDlgItem(IDC_TEXT)->GetWindowText(str); str+="连接服务器成功!\r\n"; GetDlgItem(IDC_TEXT)->SetWindowText(str); GetDlgItem(IDC_SENDTEXT)->EnableWindow(true); GetDlgItem(IDC_SEND)->EnableWindow(true); GetDlgItem(IDC_ADDR)->EnableWindow(false); GetDlgItem(IDC_PORT)->EnableWindow(false); } else { GetDlgItem(IDC_TEXT)->GetWindowText(str); str+="连接服务器失败!请重试\r\n"; GetDlgItem(IDC_TEXT)->SetWindowText(str); MessageBox(_T("connect error!")); } } } void CTCP_CLIENT_MFCDlg::OnBnClickedSend() { // TODO: 在此添加控件通知处理程序代码 CString str,str1; GetDlgItem(IDC_SENDTEXT)->GetWindowText(str); if(str=="") { GetDlgItem(IDC_TEXT)->GetWindowText(str1); //str1+="\r\n"; str1+="消息不能为空\r\n"; GetDlgItem(IDC_TEXT)->SetWindowText(str1); } else { ::send(s,(const char*)str.GetBuffer(1),sizeof(str),0); GetDlgItem(IDC_TEXT)->GetWindowText(str1); str1+="\r\n"; str1+=str; GetDlgItem(IDC_TEXT)->SetWindowText(str1); } } LRESULT CTCP_CLIENT_MFCDlg::OnSocket(WPARAM wParam,LPARAM lParam) { char cs[100]={0}; if(WSAGETSELECTEVENT(lParam)==FD_READ) { CString num; recv(s,cs,100,0); GetDlgItem(IDC_TEXT)->GetWindowText(num); num+="\r\n服务器说:"; num+=(LPTSTR)cs; GetDlgItem(IDC_TEXT)->SetWindowText(num); } return 0; }
发现服务器端程序根本就没有进入函数LRESULT CTCP_SERVER_MFCDlg::OnSocket(WPARAM wParam, LPARAM lParam),accept函数也就没有执行,网络连接不成功,网上好像也有很多人碰见这样的问题,但是感觉都没有解决,这到底是什么问题,跪求高手指点!!!