1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用
    closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
    BOOL bReuseaddr=TRUE;
    setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));

  2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历
    TIME_WAIT的过程:
    BOOL bDontLinger = FALSE;
    setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));

3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节
(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据
和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:
// 接收缓冲区
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

  1. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响
    程序的性能:
    int nZero=0;
    setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));

6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));

7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
BOOL bBroadcast=TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));

8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可
以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的
作用,在阻塞的函数调用中作用不大)
BOOL bConditionalAccept=TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));

9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们
一般采取的措施是”从容关闭”shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体
应用的要求(即让没发完的数据发送出去后在关闭socket)?
struct linger {
u_short l_onoff;
u_short l_linger;
};
linger m_sLinger;
m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
// 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
m_sLinger.l_linger=5;//(容许逗留的时间为5秒)
setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));
Note:1.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用;2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;

10.还一个用的比较少的是在SDI或者是Dialog的程序中,可以记录socket的调试信息:
(前不久做过这个函数的测试,调式信息可以保存,包括socket建立时候的参数,采用的
具体协议,以及出错的代码都可以记录下来)
BOOL bDebug=TRUE;
setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));

11.附加:往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,
我的习惯是自己写个处理网络缓冲的类,动态分配内存; 一般的习惯是自己写个处理网络缓冲的类,动态分配内存;


//仿照String    改写而成
//==============================================================================
//  二进制数据,主要用于收发网络缓冲区的数据
//  CNetIOBuffer  以  MFC  类  CString  的源代码作为蓝本改写而成,用法与  CString  类似,
//  但是  CNetIOBuffer  中存放的是纯粹的二进制数据,'\0'  并不作为它的结束标志。
//  其数据长度可以通过  GetLength()  获得,缓冲区地址可以通过运算符  LPBYTE  获得。  //==============================================================================
//    Copyright  (c)  All-Vision  Corporation.  All  rights  reserved.
//    Module:    NetObject
//    File:        SimpleIOBuffer.h
//    Author:    gdy119
//    Email  :    8751webmaster@126.com
//    Date:      2004.11.26
//==============================================================================
//  NetIOBuffer.h
#ifndef  _NETIOBUFFER_H
#define  _NETIOBUFFER_H
//=============================================================================
#define    MAX_BUFFER_LENGTH    1024*1024
//=============================================================================
//主要用来处理网络缓冲的数据
class    CNetIOBuffer
{
protected:  LPBYTE                            m_pbinData;  int                                  m_nLength;  int                                  m_nTotalLength;  CRITICAL_SECTION            m_cs;  void    Initvalibers();
public:  CNetIOBuffer();  CNetIOBuffer(const  LPBYTE  lbbyte,  int  nLength);  CNetIOBuffer(const  CNetIOBuffer&binarySrc);  virtual  ~CNetIOBuffer();
//=============================================================================              BOOL            CopyData(const  LPBYTE  lbbyte,  int  nLe
---------------------------------------------------------------  其实我觉得第5条很应该值得注意
int  nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char  *)&nZero,sizeof(nZero));  记得以前有些朋友讨论过,socket虽然send成功了,但是其实只是发送到数据缓冲区里面了,而并没有真正的在物理设备上发送出去;而通过这条语句,将发送缓冲区设置为0,即屏蔽掉发送缓冲以后,一旦send返回(当然是就阻塞套结字来说),就可以肯定数据已经在发送的途中了^_^,但是这样做也许会影响系统的性能  ---------------------------------------------------------------  setoptsock()这个函数  设置成端口复用的时候,很容易对一些没有进行单独bind模式的程序造成危害。
比如old的  ping  icmp  door,简单的sniffer后,收到包,然后设置setoptsock  bind  web服务,然后建立个cmd进程  bind再80端口。======================================
Example CodeThe following example demonstrates the setsockopt function.#include
#include "winsock2.h"void main() {//---------------------------------------
// Declare variables
WSADATA wsaData;
SOCKET ListenSocket;
sockaddr_in service;//---------------------------------------
// Initialize Winsock
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if( iResult != NO_ERROR )
printf("Error at WSAStartup\n");//---------------------------------------
// Create a listening socket
ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket()\n");
WSACleanup();
return;
}//---------------------------------------
// Bind the socket to the local IP address
// and port 27015
hostent* thisHost;
char* ip;
u_short port;
port = 27015;
thisHost = gethostbyname("");
ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list);service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(ip);
service.sin_port = htons(port);if ( bind( ListenSocket,(SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
printf("bind failed\n");
closesocket(ListenSocket);
return;
}//---------------------------------------
// Initialize variables and call setsockopt.
// The SO_KEEPALIVE parameter is a socket option
// that makes the socket send keepalive messages
// on the session. The SO_KEEPALIVE socket option
// requires a boolean value to be passed to the
// setsockopt function. If TRUE, the socket is
// configured to send keepalive messages, if FALSE
// the socket configured to NOT send keepalive messages.
// This section of code tests the setsockopt function
// by checking the status of SO_KEEPALIVE on the socket
// using the getsockopt function.
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
int iOptVal;
int iOptLen = sizeof(int);if (getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&iOptVal, &iOptLen) != SOCKET_ERROR) {
printf("SO_KEEPALIVE Value: %ld\n", iOptVal);
}if (setsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&bOptVal, bOptLen) != SOCKET_ERROR) {
printf("Set SO_KEEPALIVE: ON\n");
}if (getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)&iOptVal, &iOptLen) != SOCKET_ERROR) {
printf("SO_KEEPALIVE Value: %ld\n", iOptVal);
}WSACleanup();
return;}Notes for IrDA SocketsKeep in mind the following:The Af_irda.h header file must be explicitly included.
IrDA provides the following settable socket option:
Value Type Meaning
IRLMP_IAS_SET *IAS_SET Sets IAS attributesThe IRLMP_IAS_SET socket option enables the application to set a single attribute of a single class in the local IAS. The application specifies the class to set, the attribute, and attribute type. The application is expected to allocate a buffer of the necessary size for the passed parameters.IrDA provides an IAS Database that stores IrDA-based information. Limited access to the IAS Database is available through the windows Sockets 2 interface, but such access is not normally used by applications, and exists primarily to support connections to non-windows devices that are not compliant with the windows Sockets 2 IrDA conventions.The following structure, IAS_SET, is used with the IRLMP_IAS_SET setsockopt option to manage the local IAS Database:typedef struct _IAS_SET {
char irdaClassName[IAS_MAX_CLASSNAME];
char irdaAttribName[IAS_MAX_ATTRIBNAME];
u_long irdaAttribType;
union
{
LONG irdaAttribInt;
struct
{
u_short Len;
u_char OctetSeq[IAS_MAX_OCTET_STRING];
} irdaAttribOctetSeq;
struct
{
u_char Len;
u_char CharSet;
u_char UsrStr[IAS_MAX_USER_STRING];
} irdaAttribUsrStr;
} irdaAttribute;
} IAS_SET, *PIAS_SET, FAR *LPIAS_SET;The following structure, IAS_QUERY, is used with the IRLMP_IAS_QUERY setsockopt option to query a peer's IAS Database:typedef struct _windows_IAS_QUERY {
u_char irdaDeviceID[4];
char irdaClassName[IAS_MAX_CLASSNAME];
char irdaAttribName[IAS_MAX_ATTRIBNAME];
u_long irdaAttribType;
union
{
LONG irdaAttribInt;
struct
{
u_long Len;
u_char OctetSeq[IAS_MAX_OCTET_STRING];
} irdaAttribOctetSeq;
struct
{
u_long Len;
u_long CharSet;
u_char UsrStr[IAS_MAX_USER_STRING];
} irdaAttribUsrStr;
} irdaAttribute;
} IAS_QUERY, *PIAS_QUERY, FAR *LPIAS_QUERY;Many SO_ level socket options are not meaningful to IrDA. Only SO_LINGER is specifically supported.Note setsockopt must be called before bind on windows NT 4.0, windows 95, and windows 98 platforms.Requirements
Client Requires windows XP, windows 2000 Professional, windows NT Workstation, windows Me, windows 98, or windows 95.
Server Requires windows Server 2003, windows 2000 Server, or windows NT Server.
Header Declared in Winsock2.h.Library Link to Ws2_32.lib.DLL Requires Ws2_32.dll.  

setsockopt()改善socket网络程序的健壮性相关推荐

  1. 请教如何改善C#中socket通信机客户端程序的健壮性

    请教如何改善c#中socket通信机客户端程序的健壮性 我是做socket的新手,最近做了一个socket客户端程序,连接server的时候,如果server存在,并且允许连接的话,程序无错,正常执行 ...

  2. 程序的健壮性和鲁棒性

    一.健壮性 健壮性是指软件对于规范要求以外的输入情况的处理能力. 所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式. 另外健壮性有时也和容错性,可移植性, ...

  3. 浅析:setsockopt()改善程序的健壮性【转】

    不断的收到coolmei25 (梅生)的答谢,我都不好意思了(我都没帮到他),下面 写出我在网络编程中的一点心得体会,希望对他(^_^也对大家)有帮助: 1. 如果在已经处于 ESTABLISHED状 ...

  4. setsockopt()改善程序的健壮性

    1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: B ...

  5. C语言健壮性检验小程序,#小程序云开发挑战赛#-消灭癌细胞-休闲玩家

    #小程序云开发挑战赛#-消灭癌细胞-休闲玩家 通过扫雷的玩法和抗癌这个中心思想的结合,实现一个新时代背景下的old school网络游戏 核心玩法 以下仅为本游戏内容,仅供参考.如发现不正确的地方,欢 ...

  6. C++使用const提高函数的健壮性

    C++使用const提高函数的健壮性 看到const关键字,C++程序员首先想到的可能是const常量.这可不是良好的条件反射.如果只知道用const定义常量,那么相当于把火药仅用于制作鞭炮.cons ...

  7. 软件质量测试中的健壮性测试是什么?一文和你说

    当大多数人开车时,他们不会担心刹车失灵.当他们的孩子得到一个新玩具时,他们也不担心因故障受伤.事实上,大多数人在日常生活中根本不担心系统故障. 这是因为软件开发人员或质量控制工程师已经解决了质量问题. ...

  8. 边界测试技术——健壮性测试、最坏情况测试、健壮最坏情况测试

    转载 https://blog.csdn.net/dreamchasering/article/details/72614674 =================================== ...

  9. 解析边界测试技术——健壮性测试、最坏情况测试、健壮最坏情况测试

    黑盒测试--边界测试 边界值分析是一种常用的黑盒测试方法,是对等价类划分方法的补充:所谓边界值,是指相对于输入等价类和输出等价类而言,稍高于其最高值或稍低于最低值的一些特定情况.边界值分析的步骤包括确 ...

  10. 移动端测试 APP启动性能分析 WebView性能分析 H5性能分析 卡顿分析 帧分析 CPU统计 网络流量分析 耗电量指标 弱网测试 健壮性测试 兼容性测试 Amdahl

    Android官网使用指南性能:https://developer.android.com/topic/performance 一.APP启动性能分析 APP的启动过程 调用起APP.创建一个空白窗口 ...

最新文章

  1. 解决Parameter ‘__frch_item_0‘ not found. Available parameters 问题
  2. 不给欧美科技公司封杀的机会,从换这个国产软件开始!
  3. 微服务架构可视化平台实践
  4. 正则表达式的简单理解
  5. 无法创建 set/get 参数(参数 ID)
  6. 量子计算机理论基础,所谓量子计算机,是指建立在量子力学理论基础上的计算机...
  7. linux 定时执行搅拌,Linux上定时shell脚本
  8. html jquery 模板,用模版生成HTML的的框架jquery.tmpl使用详解
  9. python开发程序员应该知道的面试技巧和注意事项
  10. [转]Oracle分页之三:利用PagerView来实现无刷新GridView
  11. 如何用gitbook写文档并存到github上
  12. 【京东助手】滑稽东试用助手 V1.6.0
  13. sql创建表_SQL创建表
  14. js 根据公历日期 算出农历_显示阴历(农历)日期的js代码
  15. 二行代码解决全部网页木马(含iframe/script木马)
  16. 修改pc端浏览器的滚动条的默认样式
  17. [MongoDB] 运维相关操作记录
  18. Windows10 Hyper-v 虚拟机安装点心云,实现闲置宽带共享。
  19. 计算机word保存如何操作,电脑word怎么保存 在电脑上word打字怎么保存
  20. 什么是内聚?什么是耦合?

热门文章

  1. 国庆八天乐,码农长假怎么过?别加班了
  2. [矩阵] 安排比赛日程(暴力与分治法)
  3. 研究生复试------12 学做菜
  4. Problem - 1077E - E. Thematic Contests(暴力+二分)
  5. win10 修改用户名
  6. matlab 数字和字符串转换
  7. 阳春三月来几个python基础吧
  8. 在EXCEL中插入超级链接
  9. SQL Server中关于跟踪(Trace)那点事
  10. python打印的时候print(f“*******“) 的括号里的 f‘ ‘ 是什么意思 ?