MFC socket通信,该怎么解决

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函数也就没有执行,网络连接不成功,网上好像也有很多人碰见这样的问题,但是感觉都没有解决,这到底是什么问题,跪求高手指点!!!