关于MFC中的异步处理,FD_ACCEPT貌似没有起作用

太阳是我搓圆的 2012-11-22 11:12:50
我用VS2010编译一个简单的 客户服务器聊天工具.编译无错误能运行,但是客户机怎么也连不上服务器,下面贴关键代码,求指正啊.


//客户机代码..............................................



#define WM_SOCKET WM_USER+99
// CClientDlg 对话框
class CClientDlg : public CDialogEx
{
// 构造
public:
CClientDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
enum { IDD = IDD_CLIENT_DIALOG };
SOCKET s; //套接字
sockaddr_in addr; //地址

afx_msg LRESULT OnSocket(WPARAM wParam,LPARAM lParam); //自定义消息函数


BEGIN_MESSAGE_MAP(CClientDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CONNECT, &CClientDlg::OnBnClickedConnect)
ON_BN_CLICKED(IDC_SEND, &CClientDlg::OnBnClickedSend)
ON_MESSAGE(WM_SOCKET,OnSocket) //自定义连接消息和消息处理函数
END_MESSAGE_MAP()




BOOL CClientDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化代码
GetDlgItem(IDC_TEXT)->EnableWindow(false);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(false);
GetDlgItem(IDC_SEND)->EnableWindow(false);
s=::socket(AF_INET,SOCK_STREAM,0);
GetDlgItem(IDC_TEXT)->SetWindowTextW(_T("欢迎您!\r\n"));
::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_READ); //设置为异步模式

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}


LRESULT CClientDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{ //自定义消息函数............
char cs[100]={0};
if(lParam==FD_READ)
{
CString num;
::recv(s,cs,100,NULL);
GetDlgItem(IDC_TEXT)->GetWindowTextW(num);
num+="\r\n服务器说:";
num+=(LPSTR)(LPCTSTR)cs;
GetDlgItem(IDC_TEXT)->SetWindowTextW(num);
}
return 0;
}


void CClientDlg::OnBnClickedConnect()
{ //连接按钮.....
// TODO: 在此添加控件通知处理程序代码
CString str,str1;
int port;
GetDlgItem(IDC_ADDR)->GetWindowTextW(str);
GetDlgItem(IDC_PORT)->GetWindowTextW(str1);
if(str=="" || str1=="")
MessageBox(_T("服务器地址或端口不能为空\r\n"));
else
{
port=atoi((LPSTR)(LPCTSTR)(str1));
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.S_un.S_addr=inet_addr((LPSTR)(LPCTSTR)(str));
GetDlgItem(IDC_TEXT)->SetWindowTextW(_T("正在连接服务器......\r\n"));
if(::connect(s,(sockaddr*)&addr,sizeof(addr))!=SOCKET_ERROR)
{
GetDlgItem(IDC_TEXT)->GetWindowTextW(str);
str+="连接服务器成功!\r\n";
GetDlgItem(IDC_TEXT)->SetWindowTextW(str);
GetDlgItem(IDC_SEND)->EnableWindow(true);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
GetDlgItem(IDC_ADDR)->EnableWindow(false);
GetDlgItem(IDC_PORT)->EnableWindow(false);
}
else
{
GetDlgItem(IDC_TEXT)->GetWindowTextW(str);
str+="连接服务器失败!清重试......\r\n";
GetDlgItem(IDC_TEXT)->SetWindowTextW(str);
}
}
}






//服务器代码.............................


#define WM_SOCKET WM_USER+100
class CServerDlg : public CDialogEx
{
// 构造
public:
CServerDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
enum { IDD = IDD_SERVER_DIALOG };
SOCKET s,s1;
sockaddr_in addr,addr1;
int n;
afx_msg LRESULT OnSocket(WPARAM wParam,LPARAM lParam); //自定义消息函数......
}


BEGIN_MESSAGE_MAP(CServerDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_SOCKET,OnSocket) //连接自定义消息与处理函数
ON_BN_CLICKED(IDC_SEND, &CServerDlg::OnBnClickedSend)
END_MESSAGE_MAP()


BOOL CServerDlg::OnInitDialog()
{
n=0;
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化代码
s=::socket(AF_INET,SOCK_STREAM,0);
addr.sin_family=AF_INET;
addr.sin_port=htons(8888);
addr.sin_addr.S_un.S_addr=INADDR_ANY;
::bind(s,(sockaddr*)&addr,sizeof(addr));
::listen(s,2);
GetDlgItem(IDC_TEXT)->SetWindowTextW(_T("欢迎您\r\n"));
GetDlgItem(IDC_TEXT)->EnableWindow(false);
GetDlgItem(IDC_ADDR)->SetWindowText(_T("服务器监听已经启动!"));
::WSAAsyncSelect(s1,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ); //设置为异步模式

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}


LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{ //消息处理函数......
CString str13;
char cs[100];
int m=sizeof(addr1);
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
{
s1=::accept(s,(sockaddr*)&addr1,&m);
n++;
str13.Format(LPTSTR("有%d个客户已经连接上"),n);
GetDlgItem(IDC_TEXT)->SetWindowTextW(str13);
str13+=::inet_ntoa(addr1.sin_addr);
str13+=_T("登陆\r\n");
GetDlgItem(IDC_TEXT)->SetWindowTextW(str13);
}
break;
case FD_READ:
{
CString num;
::recv(s1,cs,100,0);
GetDlgItem(IDC_TEXT)->GetWindowTextW(num);
num+="\r\n";
num+=LPTSTR(::inet_ntoa(addr1.sin_addr));
num+=LPTSTR("对您说:");
num+=LPTSTR(cs);
GetDlgItem(IDC_TEXT)->SetWindowTextW(num);
}
break;
}
return 0;
}






求大神......
...全文
262 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsy012 2013-11-11
  • 打赏
  • 举报
回复
楼主,这个问题最后解决了没有?我也遇到这样的问题,纠结啊,解决不了!!!
  • 打赏
  • 举报
回复
引用 1 楼 happyparrot 的回复:
服务器端接收到客户端的连接请求了没有?
我测试发现的确是connect连接的时候出了问题,的确是socket_error错误. 错误也许就在服务器的FD_ACCEPT上面,但是我不知道怎么去改 也不知道哪儿出了问题!
bsnry 2012-11-23
  • 打赏
  • 举报
回复
没法帮你调试,没有2010 else { SetLastError(0); int nErrcode=GetLastError(); //这上这一句,看nErrCode的返回值 GetDlgItem(IDC_TEXT)->GetWindowTextW(str); str+="连接服务器失败!清重试......\r\n"; GetDlgItem(IDC_TEXT)->SetWindowTextW(str); }
这个娜戒海了 2012-11-23
  • 打赏
  • 举报
回复
LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam) 加个断点,看看有没有进去,然后分步调试
快乐鹦鹉 2012-11-23
  • 打赏
  • 举报
回复
服务器端接收到客户端的连接请求了没有?
  • 打赏
  • 举报
回复
引用 6 楼 stjay 的回复:
::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ); //设置为异步模式 是s,不是s1
嗯!这儿有个错误!!还有就是貌似CString转换char* 的时候有问题,我输入的是8888 转换出来的却是8.我把unicode改成多字符集就没问题了,但是有个新问题出来了。就是发送的消息只有2个汉字,多了不显示或者乱码 ,这个怎么解决呢???
bsnry 2012-11-23
  • 打赏
  • 举报
回复
引用 7 楼 stjay 的回复:
引用 5 楼 oJiShiBen 的回复:引用 3 楼 bsnry 的回复:没法帮你调试,没有2010 else { SetLastError(0); int nErrcode=GetLastError(); //这上这一句,看nErrCode的返回值 GetDlgItem(IDC_TEXT)->GetWindowTextW(str); str+="连……
stjay 2012-11-23
  • 打赏
  • 举报
回复
引用 5 楼 oJiShiBen 的回复:
引用 3 楼 bsnry 的回复:没法帮你调试,没有2010 else { SetLastError(0); int nErrcode=GetLastError(); //这上这一句,看nErrCode的返回值 GetDlgItem(IDC_TEXT)->GetWindowTextW(str); str+="连接服务器失败!清重试......\r\n"……
去掉SetLastError(0); 否则GetLastError当然会返回0
stjay 2012-11-23
  • 打赏
  • 举报
回复
::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ); //设置为异步模式 是s,不是s1
  • 打赏
  • 举报
回复
引用 3 楼 bsnry 的回复:
没法帮你调试,没有2010 else { SetLastError(0); int nErrcode=GetLastError(); //这上这一句,看nErrCode的返回值 GetDlgItem(IDC_TEXT)->GetWindowTextW(str); str+="连接服务器失败!清重试......\r\n"; GetDlgItem(IDC……
返回值却是0 没有错误啊,奇怪了???

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧