Socket协议的使用心得

在含有Socket协议的SDK中(DLL形式较多),建议不要做WSACleanupWSAStartup操作,否则容易造成宿主程序中用到Socket协议的地方无法正常工作;
简单说就是在SDK中尽量不要使用上面函数,除非你能保证只有该SDK中使用该协议;
笔者经历就是在宿主程序中用到MySQL的C++库,在加载含有上述函数的SDK时loadlibrary和freelibrary操作,在freelibrary后导致mysql连接无法再使用,因为在mysql的C++中使用到SOCKET协议。

WSACleanup函数的百度百科说明如下:

功能

  中止Winsock 2 DLL (Ws2_32.dll) 的使用.

头文件

  Winsock2.h

函数原型

  int PASCAL FAR WSACleanup ( void );

返回值

  操作成功返回值为0;否则返回值为SOCKET_ERROR,可以通过调用WSAGetLastError获取错误代码。
  在一个多线程的环境下,WSACleanup()中止了Windows Sockets在所有线程上的操作.

编辑本段注释

  :
  应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的 WSAStartup() 调用.当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源.任何打开的并已建立连接的SOCK_STREAM类型套接口在调用WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响- 该数据仍要发送.
  对应于一个任务进行的每一次WSAStartup()调用,必须有一个WSACleanup()调用.只有最后的WSACleanup()做实际的清除工作;前面的调用仅仅将Windows Sockets DLL中的内置引用计数递减.一个简单的应用程序为确保WSACleanup()调用了足够的次数,可以在一个循环中不断调用WSACleanup()直至返回WSANOTINITIALISED.
  返回值:
  0 操作成功.
  SOCKET_ERROR 否则.同时可以调用WSAGetLastError()获得错误代码.
  评价:
  一个常见的Windows Sockets编程错误是:试图在一个阻塞钩子函数中调用WSACleanup()并且检测返回值失败.如果在一次阻塞调用正在进行时应用程序需要退出,应用程序必须首先通过调用WSACancelBlockingCall()使该阻塞操作作废, 然后一旦控制返回给应用程序时就启动WSACleanup().
  关于Windows Sockets提供者的说明:
  良好的Windows Sockets应用程序会通过调用WSACleanup()指出它从Windows Sockets实现中注销.本函数因此可以用来释放分配给指定应用程序的资源.
  Windows Sockets的实现必须能处理应用程序在调用WSACleanup()函数之前就中止的情况.-例如,返回一个错误.
  在一个多线程的环境下,WSACleanup()中止了Windows Sockets在所有线程上的操作.
  Windows Sockets的实现必须确认WSACleanup()调用后,应用程序能调用WSAStartup()函数来重新建立Windows Sockets的应用.
  错误代码:
  WSANOTINITIALISED 使用本API前必须要进行一次成功的WSAStartup()调用.
  WSAENETDOWN Windows Sockets的实现已经检测到网络子系统故障.
  WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行.
  参见:
  WSAStartup()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值