`

socket error 10055

阅读更多
利用_beginthreadex创建的线程句柄不会自动释放,如果反复大量建线程,达到 15,0000个时,用socket发送数据时会发生10055的错误。


线程基本概念
1.线程的组成
           (1)线程内核对象:用于管理线程及存储线程的统计信息
           (2)线程栈:维护线程执行时需要的函数参数和局部变量。 线程栈所需的内存是从进程中分配而得的,其大小默认是1M.
              
           每个线程都有自已独立的线程栈。
           进程不执行任何代码,所有的代码都是由线程执行的。进程相当于一个装载线程的容器。
          线程共享进程的地址空间和数据,如内核对象句柄(内核对象句柄只能依附于某个进程而不是某个线程)

2.线程函数原型
            DWORD WINAPI ThreadFunc(PVOID pvParam)
            {
               DWORD dwResult = 0;
               ...
               return(dwResult);
            }

            The system allocates memory out of the process' address space for use by the thread's stack.

3.终止线程
              1.线程正常退出。系统会对线程函数内创建的所有对象调用析构函数。
              2.ExitThread(). 线程退出, 系统会清理线程栈。 但是系统不会对线程函数内创建的所有对象调用析构函数。
              3.TerminateThread().线程异步退出,系统不清理线程栈。只到拥有该线程的进程退出时才清理线程栈。
               该函数是个异步函数,它只会告诉系统去杀掉某个线程,但是系统不会保证当该函数返回时线程立刻终止。
               因此我们如果我们要确认线程已经终止了,则需要用WaitForSingleObject()来等待线程结束。            
              4.内核对象由进程所拥有,用户对象由线程拥有。线程可拥有两种用户对象:Windows和Hook.
              5.线程终止后,线程所拥有的用户对象会被系统释放。
             6.GetExitCodeThread() //检查线程是否已终止

4.线程内部细节
1.CreateThread 和 _beginthreadex 区别:
            
    CreateThread是系统API,_beginthreadex是CRT(C Run Time Library 运行时库)函数.     _beginthreadex内部会调用CreateThread函数。
     _endthreadex会释放_beginthreadex为tiddata结构分配的内存。

    如果线程函数中调用了CRT函数(注:不是全部CRT函数 只是其中一部分函数),则该线程函数必须由_beginthreadex而不是CreateThread函数创建。否则会产生内存泄露。
    如果在除主线程之外的任何线程中进行一下操作,你就应该使用多线程版本的C runtime library,并使用_beginthreadex和_endthreadex:
              (1) 使用malloc()和free(),或是new和delete
              (2) 使用stdio.h或io.h里面声明的任何函数
              (3) 使用浮点变量或浮点运算函数
              (4) 调用任何一个使用了静态缓冲区的runtime函数,比如:asctime(),strtok()或rand()

2._beginthreadex和_beginthread区别

    _beginthreadex内部会自动调用 _endthreadex.
    _beginthread内部会自动调用_endthread.
            
    _endthread内部会自动调用CloseHandle关闭当前Thread内核对象的句柄,所以在用_beginthread 时我们不需要在主线程中调用CloseHandle来关闭子线程的句柄。
   _endthreadex相比_endthread而言更安全。它不会自动关闭当前Thread内核对象的句柄。所以在用_beginthreadex时我们需要用CloseHandle来关闭子线程的句柄。

5.伪句柄和真实句柄

1.伪句柄(Pseudohandle):

                HANDLE GetCurrentProcess();
                HANDLE GetCurrentThread();                              
              
以上两个函数会返回指向线程或进程内核对象的伪句柄(其实以上两个函数返回的是一个常数如-1)。所以伪句柄的值永远是指向当前线程或进程的。
如果把该值传给子进程,该值则代表当前子进程的伪句柄。所以把句柄传给子线程时一定要传真时的句柄不能传伪句柄。
该句柄不会增加内核对象的引用计数,所以不需要调用CloseHandle()函数。
                              
  2.把伪句柄转换成真实句柄

DuplicateHandle会增加内核对象的引用计数,所以要用CloseHandle()来关闭复制所得的对象句柄。
              
6.Common API

                DWORD GetCurrentProcessId();
                DWORD GetCurrentThreadId();
                HANDLE GetCurrentProcess();
                HANDLE GetCurrentThread();
                     DuplicateHandle()
分享到:
评论

相关推荐

    socket常见错误代码解析.pdf

    Socket Error 10055是指缓冲区空间不足,这种错误通常是由于系统资源不足所致。解决方法是释放系统资源或增加缓冲区空间。 Socket Error 10056 - Socket is already connected Socket Error 10056是指Socket已经...

    使用ftp时出现Socket ERROR的解决方法.docx

    FTP 客户端软件 Socket ERROR 解决方法 FTP(File Transfer Protocol,文件传输协议)是一种常用的网络协议,用于在网络之间传输文件。但是在使用 FTP 客户端软件时,可能会出现 Socket ERROR 错误,影响文件传输的...

    socket错误代码对应表

    - **Socket error #10055 - No buffer space available**:没有可用的缓冲空间。 - **Socket error #10056 - Socket is already connected**:Socket已经连接。 - **Socket error #10057 - Socket is not connected*...

    SocketError

    ### SocketError 错误代码详解 #### 概述 SocketError 是指在使用套接字进行网络通信过程中遇到的各种错误情况。这些错误可能是由于网络问题、配置错误、资源限制等多种因素引起的。为了帮助开发者理解并解决这些...

    FreeSwitch的event_socket模块分析

    FreeSwitch的mod_event_socket模块是其核心组件之一,它提供了通过socket进行远程控制FreeSwitch的能力。这个模块使得管理员或者第三方应用程序能够与FreeSwitch交互,执行API命令,接收和发送事件,进行日志记录...

    VC套接字socket示例(带接收出错SOCKET_ERROR重启机制)

    它的返回值表示接收到的字节数,如果返回`SOCKET_ERROR`,则表明发生了错误。 当`recvfrom()`返回`SOCKET_ERROR`时,我们的重启机制将发挥作用。错误处理通常包括使用`WSAGetLastError()`获取错误代码,然后根据...

    socket详解 socket详解 socket详解 socket详解

    Socket 编程详解 在网络编程中,Socket 是一个基本概念, plays a crucial role in building network applications. 在 C# 中,Socket 编程是通过使用 System.Net.Sockets 命名空间中的类和方法来实现的。下面,...

    Socket-Error中文解释

    27. WSAENOBUFS(code:10055):系统缓冲区空间不足,无法执行Socket操作。 28. WSAEISCONN(code:10056):尝试连接一个已经连接的Socket。 29. WSAENOTCONN(code:10057):尝试在未连接的Socket上发送或接收...

    windows socket错误码及出错原因

    Windows Socket 错误码及出错原因 ...27. WSAENOBUFS (10055):该错误码表示缓冲区不足。 28. WSAEISCONN (10056):该错误码表示已经连接。 了解这些错误码可以帮助开发者更好地处理网络错误和优化应用程序的性能。

    总结JDBC连接SQLServer的错误Error establishing socket

    总结JDBC连接SQLServer的错误Error establishing socket

    SuperSocket写Socket客户端(连接,重连,接收处理数据)

    SuperSocket写Socket客户端(连接,重连,接收处理数据)

    Socket调制工具+操作手册

    Socket调制工具Sockettool v4是一款专用于TCP和UDP连接模拟的实用程序,它为开发者和网络技术人员提供了方便的接口来测试和调试网络应用程序。该工具的使用涉及到多个IT领域的核心概念,包括网络编程、套接字...

    Can't create TCP/IP socket(24).原因及解决办法

    3. "ERROR - Unable to connect to foreign data source- Can't create TCP-IP socket (24)_冰刀(skate)-CSDN博客.url":这可能是一个具体的案例,描述了在尝试连接外部数据源时遇到的TCP/IP套接字创建问题。...

    VC++ DLL for Socket

    9. **SocketError.h**:错误处理头文件,包含了Socket通信过程中可能出现的错误码和对应的处理机制。 在实际的开发过程中,开发者需要在`Communicate.cpp`中实现Socket的初始化、连接、监听、发送和接收等功能,并...

    Qt实现Socket断线重连机制

    void YourClass::onError(QAbstractSocket::SocketError error) { qDebug() << "Socket error: " << socket->errorString(); // 可以在这里记录错误日志,或者通知用户等 } ``` 在实际应用中,你可能需要根据...

    spring集成socket服务

    log.error("Error while stopping SocketServer", e); } } // ... 其他SmartLifecycle接口方法实现 } ``` 3. **Socket服务处理**:`SocketService`类是负责处理Socket连接的业务逻辑。它通常会创建一个新的...

    修改后的socketsvr源码

    if Result = SOCKET_ERROR then begin ErrorCode := WSAGetLastError; if ErrorCode <> WSAEWOULDBLOCK then begin Error(Self, eeReceive, ErrorCode); Disconnect(FSocket); if ErrorCode <> 0 then ...

    c#socket断开重连

    if (ex.SocketErrorCode == SocketError.ConnectionReset) { Console.WriteLine("连接断开,尝试重连..."); Reconnect(socket, serverEndPoint); // 自定义的重连方法 } } } ``` 4. **重连方法实现** 重连方法...

    C#raw Socket编程

    接着,定义RawSocket类,包括error_occurred、KeepRunning、len_receive_buf、receive_buf_bytes和socket等参数。最后,实现构造函数,初始化变量参数。 C#raw Socket编程的应用场景: 1. 网络封包监视 2. 网络...

Global site tag (gtag.js) - Google Analytics