《ASCE1885的网络编程》---Winsock APIの套接口选项函数

jane street market prediction 冠军方案 奇巧淫技与topline链接整理(3/3) 目录前言将income 作为loss(优化目标)读取数据,定义优化目标模型训练与微调提交结果多目标学习Topline整理AE+MLP (rank10)Current 17th solution: Ensembles of deep (49 layer) MLPsmixup augmentation: a way to learn from trades with weight=0 (rank4)My (perhaps) over-complicated LSTM solutionCurrent 62nd . 阅读详情

套接口在建立以后,可以通过设置套接口的属性对套接口的行为和操作进行控制,这就要使用套接口选项设置函数setsockopt()。也可以在套接口上进行操作前首先查看套接口属性的设置情况,这就要使用套接口选项获取函数getsockopt():

int setsockopt(

  __in  SOCKET s, //指定一个有效的套接口

  __in  int level, //套接口选项定义的级别,常用的有SOL_SOCKET、IPPROTO_IP和IPPROTO_TCP

  __in  int optname, //需设置的套接口选项,选项的名称是在Winsock头文件中定义的常量值

  __in  const char *optval, //指向存放选项值缓冲区的指针

  __in  int optlen //指向optval缓冲区长度的指针

);

int getsockopt(

  __in     SOCKET s, //指定一个有效的套接口

  __in     int level, //套接口选项定义的级别,常用的有SOL_SOCKET、IPPROTO_IP和IPPROTO_TCP

  __in     int optname, //需获取的套接口选项,选项的名称是在Winsock头文件中定义的常量值

  __out    char *optval, //指向存放选项值缓冲区的指针

  __inout  int *optlen //指向optval缓冲区长度的指针

);

 

若函数调用成功,则setsockopt()和getsockopt()函数都返回0。若调用时发生错误,则返回SOCKET_ERROR错误信息,应用程序通过WSAGetLastError()函数获取对错误信息的进一步说明

 

1)SOL_SOCKET选项级别:

SOL_SOCKET选项级别主要针对传输层协议(TCP或UDP)。在SOL_SOCKET选项级别下,套接口的选项有两种类型:一种是值为布尔型(BOOL)的选项,这种选项可以允许或禁止一种特性;另一种是值为整型(int)或结构型(Struct Linger)的选项,这种选项可以用来设置系统工作时的某些参数。

对于布尔型选项,oprlen应等于sizeof(int);对于非布尔型的其他选项,optval应该指向包含所需选项的整型量或结构量,而optlen则为整型量或结构量的长度。

还要注意,套接口的有些属性值即可以设置(setsockopt),也可以获取(getsockopt),但有些套接口属性只能获取或只能设置。

SOL_SOCKET选项级别下的各选项:

 

 

2)IPPROTO_IP选项级别:

IPPROTO_IP级别的套接口选项是针对网络层协议的,即IPv4协议,这些选项字段的声明大都放在Winsock.h和WinSock2.h这两个头文件中。该选项级别包括的主要选项如下表:

 

3)IPPROTO_TCP选项级别:

该选项是针对TCP协议的,在Winsock中仅有一个IPPROTO_TCP级别的选项,即TCP_NODELAY选项,该选项用来打开或关闭Nagle算法。如果该选项为TRUE,则在对应的套接口上禁止使用Nagle算法。在系统默认情况下,Nagle算法是打开的,该选项只适用于流式套接口(SOCK_STREAM),其地址族是AF_INET。

Nagle算法将未确认的数据存入缓冲区,直到蓄足一个包后一起发送,这样做的好处是可以减少主机发送的零碎小数据包的数目,以减少网络通信的开销,提供系统的吞吐量。但对于某些应用来说,这种算法将降低系统性能,例如交互性较强的Telnet应用程序,用户可通过它登录另一台远程机器,然后向其传送命令。通常,用户每秒只会进行少量的键击,若使用Nagle算法,便会造成响应的迟钝,甚至造成对方主机不予应答的错觉。此时,就应该使用TCP_NODELAY选项将此算法关闭。应用程序编写者只有在确切了解它的效果并在确实需要的情况下,才可设置TCP_NODELAY选项,因为一般的应用中如果设置该选项,则对网络性能有明显的负面影响。

 

下面的代码演示的是setsockopt函数的使用:

#include <winsock2.h>

#include <windows.h>

#include <stdio.h>

 

#pragma comment(lib, "ws2_32.lib")

 

int 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 1;

    }

   

    //---------------------------------------

    // 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);   

        WSACleanup();                 

        return 1;

    }

   

    //---------------------------------------

    // 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();

    system("pause");

    return 0;   

}

 

=======================================================

下面代码演示了getsockopt函数的使用:

#include <winsock2.h>

#include <stdio.h>

#include <windows.h>

 

#pragma comment(lib, "ws2_32.lib")

 

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 getsockopt.

         // The SO_ACCEPTCONN parameter is a socket option

         // that tells the function to check whether the

         // socket has been put in listening mode or not.

         // The various socket options return different

         // information about the socket. This call should

         // return 0 to the optVal parameter, since the socket

         // is not in listening mode.

         int optVal;

         int optLen = sizeof(int);

        

         if (getsockopt(ListenSocket,

                   SOL_SOCKET,

                   SO_ACCEPTCONN,

                   (char*)&optVal,

                   &optLen) != SOCKET_ERROR)

                   printf("SockOpt Value: %ld/n", optVal);

        

         //---------------------------------------

         // Put the listening socket in listening mode.

         if (listen( ListenSocket, 100 ) == SOCKET_ERROR) {

                   printf("error listening/n");

         }

        

         //---------------------------------------

         // Call getsockopt again to verify that

         // the socket is in listening mode.

         if (getsockopt(ListenSocket,

                   SOL_SOCKET,

                   SO_ACCEPTCONN,

                   (char*)&optVal,

                   &optLen) != SOCKET_ERROR)

                   printf("SockOpt Value: %ld/n", optVal);

        

         WSACleanup();

         return;

}

 

 

 

线性代数-第24篇:线性代数在控制系统中的核心应用 线性代数通过状态空间建模、矩阵分解与优化算法,为控制系统提供了从理论分析到工程实现的完整框架。从传统PID控制到现代智能控制,其应用贯穿系统设计、分析与优化的全流程。未来,随着多智能体协同控制、量子控制系统等前沿领域的发展,线性代数将在高维矩阵计算、分布式优化等方向持续创新,为复杂控制系统的突破提供核心支撑。如果对线性代数在控制系统中的应用细节有疑问,欢迎在评论区留言! 阅读详情

相关推荐

2 利用ITK实现多帧Dicom读取,VTK实现数据显示

vtk中也有dicom读写类,但是只能完成单帧DICOM数据读取,这对于实际应用是非常不利的。而ITK可以实现dicom多帧读取,通常情况ITK与VTK也会结合使用(ITK处理,VTK显示),所以就一起学习下吧!

buerbuhuitou的博客 1564

Winsock 同步方式 编程要点

1 、默认用作同步阻塞方式,那就是当你从不调用 WSAIoctl() 和 ioctlsocket() 来改变 Socket IO 模式.也从不调用 WSAAsyncSelect() 和 WSAEventSelect() 来选择需要处理的 Socket 事件。

虚拟化开发 721

商品评论中的实体情感分析

在之前的文章中我已经将商品评论中的评价实体,也就是特征(feature)给挖掘出来了,我看了一下,挖掘的效果还是不错的。原文链接:http://blog.youkuaiyun.com/chixujohnny/article/details/52794685 下面一步要做的是施加情感因子,也就是说,要将人们评论时候所连带的感情程度施加一下。这项任务的归类应该是情感分析技术。 目前该类问题的情感分析技

chixujohnny 7971

WinSock之基础API(二)

WinSock之基础API(二)                                       5.1.6 getsockname()  简述:    获取一个套接口的本地名字。    #include    int PASCAL FAR getsockname( SOCKET s, struct sockaddr FAR* name,

nicholasmaxwell的专栏 1229

emir分析RC corner如何选择

power analysis阶段 RC corner的选择

weixin_61954252的博客 3591

Ubuntu 24.04下Loki+Alloy+Grafana日志分析系统的快速部署与实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Loki+Alloy+Grafana轻量级日志分析系统的完整流程。通过二进制安装Loki、配置Alloy采集器以及设置Grafana可视化界面,构建了一套资源消耗低、易于管理的日志解决方案,并实战演示了如何采集和分析网络设备日志,特别适合资源有限的中小团队或边缘计算场景。

tensor9flow的博客 234

setsockopt()

<br />设置套接口的选项。 <br />  #include <winsock.h> <br />  int PASCAL FAR setsockopt( SOCKET s, int level, int optname, <br />  const char FAR* optval, int optlen); <br />  s:标识一个套接口的描述字。 <br />  level:选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。 <br />  optname:需设置的选

kakaxia6337的专栏 582

【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解

2025年五一数学建模竞赛 A题:基于历史数据与模式识别的道路车流量推测模型研究

Magnolia_He的博客 3783

Socket/TCP粘包、多包和少包, 断包

Socket/TCP粘包、多包和少包, 断包 分类: java2012-03-12 00:35 4492人阅读 评论(3) 收藏 举报 minatcpexceptionsocketimage算法 目录(?)[+] 为什么TCP 会粘包    前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整。为什么会这样吗,我们用mi

pi9nc的专栏 5万+

paddlehub无法安装,安装报错【Bug完美解决】

paddlehub无法安装,安装报错【Bug完美解决】 我们正在进行一个基于Python的项目开发,该项目需要集成PaddleHub,以利用其丰富的深度学习模型和工具。PaddleHub提供了一种简便的方式来使用预训练模型,以加速开发过程并提高模型效果。 现在paddlehub安装出现问题了,本文彻底解决paddlehub无法安装的问题。

一键难忘的博客 3387

RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)

本文记录的是利用中的模块优化的目标检测网络模型。通过局部特征提取器、周围环境提取器、联合特征提取器和全局环境提取器来提取局部特征、周围环境和全局环境信息,充分利用不同层次的信息。本文将其应用到中,并进行二次创新,使网络能够更好的处理多类别目标的分类能力。CGNet: A Light-Weight Context Guided Network for Semantic Segmentation1️⃣ 首先通过局部特征提取器floc(∗)floc(*)floc(∗)和周围环境提取器fsur(∗)f_{sur }

Limiiiing的博客 1349

《ASCE1885的网络编程》---Winsock APIの套接口I/O处理函数

《ASCE1885的网络编程》---Winsock APIの套接口I/O处理函数 2010年08月03日   在Windows环境下,套接口的通信方式分为两种:阻塞方式和非阻塞方式。阻塞方式下工作的套接口在进行I/O操作时,函数要等待到相关操作完成以后才能返回;非阻塞方式下工作的套接口在进行I/O操作时,无论操作是否成功,调用都会立即返回。   阻塞方式和非阻塞方式各有优缺点,阻塞方...

xvn57xvn 160

华为OD机试2025C卷-双十一最大花费金额[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率

双十一最大花费金额 - 动态规划解法 摘要:本文介绍了华为OD机试中"双十一最大花费金额"问题的动态规划解法。该问题要求在给定N件商品价格和优惠券面额X的情况下,选择若干商品使总花费不超过X且尽可能大。核心解法采用布尔型动态规划数组,记录每个金额是否可被拼出。算法时间复杂度为O(N*X),空间复杂度为O(X)。通过倒序遍历避免重复选择同一商品,最后从X向下查找第一个可达金额作为答案。文中提供了C++和Java的实现代码,并解释了与经典0-1背包问题的关系。 关键点: 问题本质是0-1背包/子集和问题的变体

2503_91057718的博客 46

《ASCE1885的网络编程》---Winsock APIの网络信息获取函数

<br />网络中的主机需要安装TCP/IP协议或其他协议才能进行通信,网络应用程序有时需要获取主机上或网络有关的信息,这些信息一般存放在数据文件中。如Unix系统中,主机名存放在/etc/hosts文件中,网络信息则存放在etc/networks文件中,因此这类获取主机上与网络有关的信息的函数也叫数据库函数。<br />与网络有关的信息主要分为4大类:<br />主机信息:函数名一般以gethostby开头,在程序中较多使用;<br />网络信息:函数名一般以getnetby开头,在程序中较少使用;<br

ASCE1885 1768

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《ASCE1885的网络编程》---Winsock APIの字节排序函数

不同的计算机系统在存储由多个字节组成的信息时,有些系统将高序字节存放在低地址处,而有些系统则将低序字节存放在低地址处,即“大序在前”(Big-Endian)和“小序在前”(Little-Endian)。在计算机网络中,发送端在传输数据之前必须要将用主机字节Host-byte顺序表示的数据转化成网络字节Network-byte顺序,然后才能发送数据。在数据接收端,系统要把收到的网络字节顺序的数据转化为主机字节顺序的数据。在Winsock API中,专门有一类函数用来进行主机字节顺序和网络字节顺序数据的相互转化

ASCE1885 1734

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《ASCE1885的网络编程》---Windows API基本函数の套接口与连接的建立

<br />1)打开Winsock---WSAStartup()<br />使用Winsock API编制的网络应用程序中,在调用任何一个Winsock函数之前,都必须检查协议栈的安装情况,也就是检查系统中是否有Windows Sockets的实现库。调用的是WSAStartup函数,详见:《Windows API巡礼》---WSAStartup和WSACleanup(http://blog.youkuaiyun.com/ACE1985/archive/2010/07/03/5710430.aspx)。<br /> <

ASCE1885 1751

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《ASCE1885的网络编程》---Winsock API基本函数の数据传输

<br />在Winsock中,用于数据发送和接收的系统调用分为两组:一组是有连接的数据发送和接收系统调用;一组是无连接的数据发送和接收系统调用。这里我们先弄清与数据发送和接收关系密切的“带外数据”的概念。<br /> <br />1)带外数据概念:<br /> <br />有时我们可能要传输一些相对来说比较重要的数据,如果按普通数据进行传送,那么在传输过程中要受流量、拥挤等控制的影响。对于这些比普通数据重要的数据,在传输过程中可以标记为带外数据(Out-Of-Band,OOB)。<br />对于带外数据,

ASCE1885 1830

《ASCE1885的网络编程》---Winsock APIのIP地址转换函数

在进行网络程序设计时,常常需要从键盘上输入用点分十进制记法表示的主机IP地址,这种IP地址在程序中一般是用ASCII字符串的形式存储的。在网络程序中,要把这种用点分十进制字符串表示的IP地址转换为用网络字节顺序表示的IP地址。如果在程序中需要输出IP地址时,要把用二进制表示的网络字节顺序的IP地址转化为点分十进制形式表示的主机IP地址,用户才可以识别。在Winsock API中提供了这样的函数,这种函数以inet开头。1)点分十进制表示的IP地址转换为网络字节顺序的IP地址---inet_addr()Ine

ASCE1885 2417
上一篇: 《Windows核心编程》の内存操作和内存信息管理
下一篇: 《ASCE1885的网络编程》---Winsock APIの套接口I/O处理函数
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值