Socket.Select()函数使用不当引发的问题(关于套接字在线程间传递是否可行的验证)

使用环境:VS2010 C#

做东西的时候碰到一个问题:

在后台中,创建了一个监听线程,用来监听是否有连接到监听地址的请求,如果有,则加入监听套接字集中;(这样的话,一个线程就可以接收N个套接字的信息)

创建了一个接收线程,对监听套接字集中的套接字进行消息接收,并将该消息显示出来;

其中,监听套接字集中有与服务器连接的套接字srvCommSock

出错状况:

类似下图所示


即,后台只收到了连接请求,但是却接收不到消息

发送端则显示成功发送了消息,使用的是TCP/IP协议,所以是安全的

但是消息跑哪儿了呢?

分析原因:

刚开始的时候毫无头绪,后来请教了下高手,说可能说线程A创建的套接字在线程B中可能访问不了(之后验证是可以的)

而且单步执行的时候,发现确实是有问题的。新加进来的套接字属性Socket.Connected为false(后来发现该属性不能作为套接字是否连接的依据,详细见文章Socket.Connected不能在调试时作为套接字是否连接的判断依据

为了验证,做了一个简单的测试程序

测试代码如下:

监听线程代码:

       private void _lstnThreadProc()
        {
            //for check
            Console.WriteLine("_lstnThreadProc线程开始执行,监听其他用户的连接请求");
            //开始监听
            try
            {
                while (true)
                {
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值