mfc CSocket类

cutrain2009 2009-07-22 08:13:13
我要编写的是一个简单的网络程序,模拟聊天的,但只是为了实现一个客户端连接服务端,客户端向服务端发送信息,服务端再返回该消息的功能
客户端:
从CSocket中派生出CMySocket类
重载了函数
void CMySocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CSampleclientDlg *m_pDlg=(CSampleclientDlg *)AfxGetMainWnd();
m_pDlg->DealReceive();

CSocket::OnReceive(nErrorCode);
}
其中定义了
void CSampleclientDlg::DealReceive()
{
char *buff=new char[1024];
m_socketClient.Receive(buff,1024,0);
m_listMessage.AddString(buff);
}
m_listMessage是一个列表控件的一个控制变量

发送到消息处理
void CSampleclientDlg::OnSend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
char *buff=new char[1024];
buff=(LPSTR)(LPCTSTR)m_strMessage;
m_socketClient.Send(buff,1024,0);
m_strMessage="";
UpdateData(FALSE);
}这是一个发送按钮的消息处理,m_strMessage是文本编辑框的变量

当然还有在初始化中,即对话款初始(我是用做对话框为基础的程序)的加入套接字的初始
m_socketClient.Create(5051,SOCK_STREAM,NULL);
if(m_socketClient.Connect("127.0.0.1",5050))
{
}
else
AfxMessageBox("无法连接服务器");

客户端可以确定建立的没有问题,因为我用另一个用api直接写服务端的程序可以正常工作


以下是我建立服务端的过程,这样建立的服务端不知怎么的很奇怪,在编译完运行服务端,这时客户端可以连接并正常工作。
关闭服务程序,再运行,客户端就没法连接了。只有在重新编译服务端又可以再正常工作一次。关闭就又不行了

服务端程序主界面是对话框,主要是两个按钮,开始和停止
void CChatRoomServerDlg::OnStart()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_START)->EnableWindow(FALSE);
m_socketListen.Create(5050,SOCK_STREAM,NULL);
m_socketListen.Listen(5);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}

void CChatRoomServerDlg::OnStop()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
m_socketListen.Close();
m_socketClient.Close();
GetDlgItem(IDC_START)->EnableWindow(TRUE);
}
我是重CSocket中派生出CMySocket的
重载了
void CMySocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CChatRoomServerDlg * m_pDlg=(CChatRoomServerDlg *)AfxGetMainWnd();
Accept(m_pDlg->m_socketClient);
CSocket::OnAccept(nErrorCode);
}
void CMySocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CChatRoomServerDlg * m_pDlg=(CChatRoomServerDlg *)AfxGetMainWnd();
m_pDlg->DealMessage();
CSocket::OnReceive(nErrorCode);
}

定义
void CChatRoomServerDlg::DealMessage()
{
char buff[1024];
int count;
count=m_socketClient.Receive(buff,1024,0);
m_socketClient.Send(buff,1024,0);
}

我是新手,刚学win32 请指点下

我尝试把m_socketClient定义为动态的,有时候可以不用重新编译就可以让他正常工作
...全文
137 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-07-22
  • 打赏
  • 举报
回复
这个不是三两句解释得了得,建议楼主去买本网络编程得书系统看
[Quote=引用 6 楼 cutrain2009 的回复:]
还没到那种水平,
也就是说我需要修改的做法是用CAsyncSocket来替代CSoket类,这样我在用我现在的消息处理做法
这样的理解可以吗
[/Quote]
cutrain2009 2009-07-22
  • 打赏
  • 举报
回复
还没到那种水平,
也就是说我需要修改的做法是用CAsyncSocket来替代CSoket类,这样我在用我现在的消息处理做法
这样的理解可以吗
arong1234 2009-07-22
  • 打赏
  • 举报
回复
因为只有在开始的时候Onxxxx函数才确保是触发的,一旦进入某些调用,这些函数就不保证触发,你的测试用例太简单了,还看不出。

Onxxx系列函数是为了“异步”调用而准备的,CSocket是同步调用,你混合两种模式,从逻辑上也是错误的
cutrain2009 2009-07-22
  • 打赏
  • 举报
回复
好奇怪
不知怎么的现在服务端有可以正常工作 了

你客户端给的建议受教啦,让系统确定客户端的端口很有用

还有为什么不
“”另外:如果你想用OnSend/OnReceive,你需要用CAsyncSocket,如果是CSocket,不要用这些函数”“:
我上面的用法好像没多大影响啊,而且我蛮好理解的
arong1234 2009-07-22
  • 打赏
  • 举报
回复
在你关闭服务器程序后,在cmd中用netstat -ano命令看看这个端口是不是真的被释放了,我估计你那个“关掉”的程序根本没有完全释放,进程甚至可能根本没退出
[Quote=引用 2 楼 cutrain2009 的回复:]
为什么我用另一个服务端程序就可以正常工作呢,
另一个服务的是直接用api 套接字来写的
问题不是出在客户端上的
[/Quote]
cutrain2009 2009-07-22
  • 打赏
  • 举报
回复
为什么我用另一个服务端程序就可以正常工作呢,
另一个服务的是直接用api 套接字来写的
问题不是出在客户端上的
arong1234 2009-07-22
  • 打赏
  • 举报
回复
socket被关闭以后,系统会保留这个socket直到它所有的操作都完成(大概可能要1分钟多),因此此时如果你尝试用同一个端口创建socket就失败,正确做法是把下面的端口改为0

m_socketClient.Create(5051,SOCK_STREAM,NULL);

改为

m_socketClient.Create(0,SOCK_STREAM,NULL);

很少有需求指定客户端端口,应该由系统随机指定

另外:如果你想用OnSend/OnReceive,你需要用CAsyncSocket,如果是CSocket,不要用这些函数

18,356

社区成员

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

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