初学mfc和socket,请教一下

IMBlues 2013-06-20 01:49:23
我做了个聊天室的软件,服务端和客户端都是采用mfc继承csocket类的同步阻塞,本机测试一切正常,一旦在局域网连接就出现问题了:
输入对方ip触发connect(第一次连接),会出现10061(wsaconnrefused服务器拒绝)的错误,但如果本机打开服务端,输入对方ip(第二次连接),却连接到本机服务端,断开后仍输入对方ip,再次connect(第三次连接),这时连接却很正常,其他功能也都正常。第一、二次不能连接的时候,服务端的OnAccept根本没有触发,第三次连接却能触发到OnAccep。不清楚这究竟是怎么一回事,是网络原因,还是编程问题?
...全文
170 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
IMBlues 2013-06-20
  • 打赏
  • 举报
回复
恳请大家帮忙,这是我们的c语言作业。
IMBlues 2013-06-20
  • 打赏
  • 举报
回复
又沉了,顶一下
IMBlues 2013-06-20
  • 打赏
  • 举报
回复
没人来,我只有顶一下了。
IMBlues 2013-06-20
  • 打赏
  • 举报
回复
搞了半天是我没有updatedata,导致没有更新用户输入ip,这样一个弱智错误竟然没有发现,弄得我怀疑网络编程去了。 非常感谢你的回答,我会把分给你的。
IMBlues 2013-06-20
  • 打赏
  • 举报
回复
客户端 void CChattyNewDlg::OnButtonConn() { // TODO: Add your control notification handler code here m_pSocket = new CCSocket(this); if (!m_pSocket->Create()) { delete m_pSocket; m_pSocket =NULL; AfxMessageBox("Socket Fail!"); return; } if(!m_pSocket->Connect(m_ip,m_port)) { TCHAR str[100]; itoa(WSAGetLastError(),str,10); delete m_pSocket; m_pSocket = NULL; AfxMessageBox("cannot connect!"); AfxMessageBox(str); return; } 服务端 void CTsDlg::OnAccept() { //创建用于与客户机端连接并交换数据的套接字对象 CCSocket* pSocket = new CCSocket(this); if (m_pLSocket->Accept(*pSocket)) //接收客户机的连接请求 { pSocket->Initialize(); m_connList.AddTail(pSocket); //更新在线人数 CString strTemp; strTemp.Format("在线人数:%d",m_connList.GetCount()); m_staNum.SetWindowText(strTemp); } else { //TCHAR str[100]; //itoa(WSAGetLastError(),str,10); //AfxMessageBox(str); delete pSocket; } } void CTsDlg::OnButtonListen() { // TODO: Add your control notification handler code here UpdateData(TRUE); //获得用户输入 //创建侦听套接字对象 m_pLSocket = new CLSocket(this); if (!m_pLSocket->Create(m_nPort)) { TCHAR str[100]; itoa(WSAGetLastError(),str,10); delete m_pLSocket; m_pLSocket = NULL; AfxMessageBox("Sock Fail!"); AfxMessageBox(str); return; } //启动监听套接字,时刻准备接收客户机端的连接请求 if (!m_pLSocket->Listen()) { delete m_pLSocket; m_pLSocket = NULL; AfxMessageBox("Listen Error"); return; } //OnAccept事件的处理函数,当套接字收到FD_Accept消息时,自动调用此函数 void CLSocket::OnAccept(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class CSocket::OnAccept(nErrorCode); m_pDlg->OnAccept(); } 我把有关连接的代码单独扣了出来,我是继承csocket类的 服务端打开,监听没有问题。 至于你说的ip问题,不知道在不初始化ip,connect是不是默认是本机ip。
hsz871204 2013-06-20
  • 打赏
  • 举报
回复
也就是说你第一次跟第二次连的都是本机,而在第二次连接成功到断开连接的时候,socket的IP才变成你所输入的IP
hsz871204 2013-06-20
  • 打赏
  • 举报
回复
没碰到过这种情况,没看到代码不好下定论,目测自己IP没取对,联一次本机后就取对了

18,356

社区成员

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

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