这几天想在一个开源的代码上进行修改,以期研发出一个产品出来。
       程序原来是单线程网络程序,需要修改为多线程,修改之后,总是出问题,辅助线程中的recv函数总是运行一阵子之后收到长度为-1的数据报,导致程序运行不正确甚至崩溃。
        由于是多线程,只好打日志进行调试,发现一个奇怪的问题。在A线程与B线程中,均使用了socket这个函数来产生socket,竟然会产生两个相同返回值的socket!也就是说,A线程与B线程能同时获得socket值为360的socket,这样当A正在使用360进行数据接收时,B去连接一把,A自然就出错了。

这个问题实在是诡异,因为socket又不是COM组件,是可以直接在线程中共享的,究竟是出了什么问题呢,MSDN和网络上没有见到任何与此问题相关的内容。活脱脱地就是API出错了!按道理这是不可能的事情啊。
         实在没辙了,只好review代码,发现程序中有很多这样的语句:
        if( mSocket != INVALID_SOCKET )
        {
                closesocket( mSocket );
         }
        这句有什么问题没有?呵呵看起来没什么问题,但是,不容置疑的是,肯定会导致一个socket被关闭多次。本着死马当着活马医的原则,进行修改,每次closesocket之后,将socket的值置为INVALID_SOCKET,运行程序,问题解决。

这个问题也太ft了,windows竟然连这个容错都没有做,按道理这是很好做的,socket实际上只是一个索引值,系统内核在关闭时如果发现已经关闭就不要做操作就可以了。现在看起来,内核里面貌似是一个socket缓冲池,程序在使用的时候使用计数来管理生命周期。这样当一个socket被关闭多次后,再创建改socket之后,系统可能会认为该socket是关闭的(因为计数小于等于0)。所以下次分配的时候,会将该索引重新分配出去。

该问题在vista home版上出现,其他平台又没有问题不得而知,由此可以看出成对编码的好处以及面向对象封装的好处。

转自:http://blog.csdn.net/chen495810242/article/details/42029825

个人注释:在win7上的测试结果,当一个工程调用多个dll的时候,不同的dll之间使用socket这个函数来产生socket,返回值是可能一样的,就会发生连接无缘无故被断开的现象,查了两三天的说

(转载) socket:10038错误{winSock的一个bug:当closesocket多次错误使用时会导致问题}的更多相关文章

  1. 说一说packet poll 错误掩码的一个bug tcp udp packet poll细节有所不同 处理时需要注意

    今天处理一个cpu标高的bug,原因:在poll 返回后将error事件当做POLLIN事件处理,fd 一直都在唤醒线程处理,但是rcv的时候没有数据: unsigned int datagram_p ...

  2. js在ie6下的一个bug—未结束标签的错误

    在IE6下,如果在body标签没结束前,用代码获取body对象就会出现错误.如: <html> <head> <script type="text/javasc ...

  3. memory_limit的一个bug | 风雪之隅

    原文:memory_limit的一个bug | 风雪之隅 27 Nov 09 memory_limit的一个bug 作者: Laruence( ) 本文地址: http://www.laruence. ...

  4. [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

    google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...

  5. AIX6.1/11.2.0.3在有关数据库SWAP一个BUG

    昨天南京到客户服务数据库的优化调整,其中新上线,经过审查alert.log当日志现在是在过去一段时间内取得,每隔几个小时的时间滞后,班会报似的内容: Thu Aug 21 09:01:26 2014 ...

  6. 花了5天时间,终于解决了一个bug,心情非常愉快,憋了这么久,不吐不快

    http://www.cnweblog.com/fly2700/archive/2011/12/06/318916.html (转载) 花了5天时间,终于解决了一个bug,心情非常愉快,憋了这么久,不 ...

  7. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  8. 由一个bug引发的SQLite缓存一致性探索

    问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...

  9. 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG

    这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...

随机推荐

  1. 我的第一个MVC项目

    这是本人第一个完全按照MVC开发模式完成的项目,非常简陋,仅仅完成的查询,保存,删除基本功能,而且存在编码问题没有解决,以后会慢慢增加功能.慢慢改进 package com.sdjt.dao; imp ...

  2. iOS方法类:CGAffineTransform的使用

    CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放.旋转和平移操作: 另称放射变换矩阵,可参照线性代数的矩阵实现方式0. ...

  3. Cortex-M3知识点

    1.不再像别的ARM7那样从thumb状态和ARM状态来回切换 Thumb-2指令集横空出世,Cortex-M3不支持ARM指令集 2.BKP备份寄存器(42个16位寄存器组成),用来存储用户应用程序 ...

  4. Jquery网页选项卡应用

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  5. javascript 数组学习(一)

    今天学习了一下<javascript权威指南(第6版)>的第七章:数组 一.数组的创建: 数组的创建有3种方法: var colors = new Array(3);//可以省略new v ...

  6. HTML5简单入门系列(七)

    前言 本篇详细介绍canvas画布的API.说是详细介绍,也只是一些常用的API及简单实例和说明.LZ本人也还没有看完全部,下篇会介绍剩余的一些内容. 本篇的示例中,LZ加入了注释,为的是只简单介绍A ...

  7. python----特性002

    python特性002:特性是可继承的 #!/usr/local/python3.5/bin/python3 class Person(object): def __init__(self,name) ...

  8. 【转】iOS代码规范

    原文地址: http://www.cocoachina.com/ios/20150908/13335.html 简介: 本 文整理自Apple文档<Coding Guidelines for C ...

  9. 【转】Objective-C 与 Runtime:为什么是这样?

    原文地址: http://t.cn/RyyNIXd?u=2483713130&m=3884400301576073&cu=2483713130 笔者非常高兴能为Objective-C写 ...

  10. UltraEdit的语法高亮显示配置

    今天吴同学看到我电脑中有UltraEdit好奇地问我会不会用,我那个汗啊,不会用我装它干什么啊?其实当时装UltraEdit主要是用来写Java的,没有想到,工作一忙顾及不上学习Java的事情了.于是 ...