关于TCP/IP连接的问题???急!!!

爵士萨克斯风 2001-12-25 05:13:23
客户端开辟线程与服务器连接,每个线程绑定一个连接端口的指针与服务器通讯,为何发送完成接收时总出错?但有时有时好的?
...全文
156 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zl_2001 2002-02-27
  • 打赏
  • 举报
回复
学习
masterz 2001-12-27
  • 打赏
  • 举报
回复
CSocket不能跨线程传递,只能先Detach,传递socket,然后Attach 到socket,
CSocket只能用在GUI线程中,应为他要把socket event插入到window message queue中
爵士萨克斯风 2001-12-27
  • 打赏
  • 举报
回复
请各位帮忙UP^,也有分!!
爵士萨克斯风 2001-12-27
  • 打赏
  • 举报
回复
to supperapplication(行星):
我就是因为在线程里创建socket不行,所以才选择了这种机制,是否是CSocket类的bug?
采用Release方式编译就好了!!!究竟为什么?
哪位高手能告诉我?
爵士萨克斯风 2001-12-27
  • 打赏
  • 举报
回复
汗颜!
多谢各位,我茅塞顿开!
azuo_lee 2001-12-27
  • 打赏
  • 举报
回复
并不是CSocket类的bug,因为MFC的文档已经明确说明了这一点:不要跨线程使用CSocket。原因正如masterz()所说:
1。在线程里创建socket是可以的,但创建CSocket则不行。因为CSocket会创建一个隐藏窗口接收socket的notification,而一般的worker线程是没有消息队列的,所以窗口根本无法工作。要使线程中的CSocket能够工作,必须为此线程创建消息队列及消息循环。
2。正是因为CSocket使用了内嵌的窗口,因此CSocket不是一个线程间安全的类。所以不能在线程之间使用CSocket类。线程间的安全性问题与MFC的handle map有关。但使用标准的Windows窗口句柄不会出这种问题。
3。解决的办法有两种:一、主线程Detach,传递socket handle给工作线程,工作线程Attach;二、纯粹使用Winsock API,因为CSocket本身就不是个很好用的东西。
爵士萨克斯风 2001-12-27
  • 打赏
  • 举报
回复
to masterz():
一切正如你所说的,可是,很不幸,问题的原因不在这里!
我怀疑,可能是CSocket类的bug!
各位还有其他意见吗?
如果真是这样,我真的好失望,中国的软件业!。。。
supperapplication 2001-12-26
  • 打赏
  • 举报
回复
在线程里面创建socket,不要先创建socket,再创建线程。
爵士萨克斯风 2001-12-26
  • 打赏
  • 举报
回复
Please!
starcbh 2001-12-26
  • 打赏
  • 举报
回复
:) me
爵士萨克斯风 2001-12-26
  • 打赏
  • 举报
回复
请各位帮忙,Up也可!!
多谢了!
爵士萨克斯风 2001-12-26
  • 打赏
  • 举报
回复
怎么没人回答?
分数不够了还可以加!
爵士萨克斯风 2001-12-25
  • 打赏
  • 举报
回复
我的意思是:一个连接一个线程,并向线程中传递一个套接字指针进行收发。
代码如下:
for( int i=0;i<MAX_THREAD;i++ )
{
if ( NULL != m_pClientThread[i] )
{
delete m_pClientThread[i];
m_pClientThread[i] = NULL;
}
m_pClientTcp[i] = new CClientSocket();
if ( !m_pClientTcp[i]->Create() )
{
delete m_pClientTcp[i];
m_pClientTcp[i] = NULL;
AfxMessageBox("创建套接字失败!");
return;
}
bRet = m_pClientTcp[i]->Connect( m_strAddress,m_nSocket );
if (!bRet)
{
strMsg = "连接服务器失败!\n";
AfxMessageBox(strMsg);
return;
}
m_pClientThread[i] = new CClientThread(this,m_pClientTcp[i]);
if ( !m_pClientThread[i] ) return;
if( !m_pClientThread[i]->CreateThread() )
{
AfxMessageBox("创建线程失败!");
return;
}
}
freeclick 2001-12-25
  • 打赏
  • 举报
回复
代码贴出来,
再说,客户端不需要绑定端口的.

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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