UDP --02--UDP广播数据
来源:互联网 发布:淘宝上发光闹钟说明书 编辑:程序博客网 时间:2024/06/06 02:49
设计模型
局域网UDP广播数据端UdpBroadCast.cpp
#include <tchar.h> // _T宏#include <stdio.h>// printf sprintf#include <iostream>// cout fstreamusing namespace std;// windows socket#include <winsock.h>#pragma comment (lib,"ws2_32.lib")bool initSocketLib();void main(){SOCKET sock; //socket套接字char szMsg[] = "this is a UDP test package";//被发送的字段// 1.启动SOCKET库,版本为2.0WORD wVersionRequested;WSADATA wsaData;int err; wVersionRequested = MAKEWORD( 2, 0 );err = WSAStartup( wVersionRequested, &wsaData );if ( 0 != err ) {cout<<"Socket2.0初始化失败,Exit!";return;}if (LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) { // 检查Socket库的版本是否为2.0WSACleanup( );return; }// 2.创建socketsock = socket( AF_INET, SOCK_DGRAM, IPPROTO_IP/*虚拟IP*/);if (INVALID_SOCKET == sock ) {cout<<"Socket 创建失败,Exit!";return;}// 3.设置该套接字为广播类型,bool opt = true;setsockopt(sock, SOL_SOCKET, SO_BROADCAST/*广播*/, reinterpret_cast<char FAR *>(&opt), sizeof(opt));// 4.设置发往的地址sockaddr_in addrto;memset(&addrto,0,sizeof(addrto));addrto.sin_family = AF_INET; // 地址类型为internetworkaddrto.sin_addr.s_addr = INADDR_BROADCAST; // 设置ip为广播地址addrto.sin_port = htons(7861); // 端口号为7861int nlen=sizeof(addrto);unsigned int uIndex = 1;while(true) {Sleep(1000);//向广播地址发送消息if( sendto(sock, szMsg, strlen(szMsg), 0, (sockaddr*)&addrto,nlen)== SOCKET_ERROR ) {cout<<WSAGetLastError()<<endl;}else {cout<<uIndex++<<":an UDP package is sended."<<endl;}}if (!closesocket(sock)) { // 关闭套接字WSAGetLastError();return;}if (!WSACleanup()) { // 关闭Socket库WSAGetLastError();return;} return;}bool initSocketLib(){WSADATA Data;//初始化windows Socket Dllint status = WSAStartup(MAKEWORD(1,1),&Data);if (0!=status){printf(_T("初始化失败\n"));return false;}return true;}
局域网UDP接收广播数据端Receive.cpp
#include <tchar.h> // _T宏#include <stdio.h>// printf sprintf#include <iostream>// cout fstreamusing namespace std;// windows socket#include <winsock.h>#pragma comment (lib,"ws2_32.lib")bool initSocketLib();void main(){if(!initSocketLib())return;// 初始化本地客户端套接字SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(serSocket == INVALID_SOCKET){printf("socket error !");return ;}// "本地"的服务端地址映射(IP:port)sockaddr_in serAddr;serAddr.sin_family = AF_INET;serAddr.sin_port = htons(7861);serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.53");// 因为这是远程机器,客户端也不在本机上,所以绑定实际的物理地址if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR){printf("bind error !");closesocket(serSocket);return ;}sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr); while (true){char recvData[255]; int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);if (ret > 0){recvData[ret] = 0x00;printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));printf(recvData); }//char * sendData = "一个来自服务端的UDP数据包\n";//sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen); }closesocket(serSocket); WSACleanup();return ;}bool initSocketLib(){WSADATA Data;//初始化windows Socket Dllint status = WSAStartup(MAKEWORD(1,1),&Data);if (0!=status){printf(_T("初始化失败\n"));return false;}return true;}
setsockopt函数
该 setsockopt的功能设置一个套接字选项。
句法
int setsockopt( _In_ SOCKET s, _In_ int level, _In_ int optname, _In_ const char * optval, _In_ int optlen );
参数
- s [in]
标识套接字的描述符。
- 水平 [in]
定义选项的级别(例如,SOL_SOCKET)。
- optname [in]
要为其设置值的套接字选项(例如,SO_BROADCAST)。所述OPTNAME参数必须在规定的范围内所定义的套接字选项级别,或行为是未定义的。
- optval [in]
指向缓冲区的指针,其中指定了所请求的选项的值。
- optlen [in]
由optval参数指向的缓冲区的大小(以字节为单位)。
返回值
如果没有发生错误,则 setsockopt将返回零。否则返回值SOCKET_ERROR,并通过调用WSAGetLastError来检索特定的错误代码 。
- WSANOTINITIALISED
在使用此功能之前,必须发生成功的 WSAStartup调用。
- WSAENETDOWN
网络子系统失败。
- WSAEFAULT
optval参数指向的缓冲区不在进程地址空间的有效部分或 optlen参数太小。
- WSAEINPROGRESS
正在进行阻止Windows Sockets 1.1呼叫,或者服务提供商仍在处理回调函数。
- WSAEINVAL
的电平的参数是无效的,或者在缓冲器中的信息指向的optval的参数是无效的。
- WSAENETRESET
设置SO_KEEPALIVE时,连接已超时。
- WSAENOPROTOOPT
该选项对于指定的提供程序或套接字是未知的或不受支持的(请参阅SO_GROUP_PRIORITY限制)。
- WSAENOTCONN
SO_KEEPALIVE设置后,连接已被重置。
- WSAENOTSOCK
描述符不是套接字。
- WSANOTINITIALISED
在使用此功能之前,必须发生成功的 WSAStartup调用。
- WSAENETDOWN
网络子系统失败。
- WSAEFAULT
optval参数指向的缓冲区不在进程地址空间的有效部分或 optlen参数太小。
- WSAEINPROGRESS
正在进行阻止Windows Sockets 1.1呼叫,或者服务提供商仍在处理回调函数。
- WSAEINVAL
的电平的参数是无效的,或者在缓冲器中的信息指向的optval的参数是无效的。
- WSAENETRESET
设置SO_KEEPALIVE时,连接已超时。
- WSAENOPROTOOPT
该选项对于指定的提供程序或套接字是未知的或不受支持的(请参阅SO_GROUP_PRIORITY限制)。
- WSAENOTCONN
SO_KEEPALIVE设置后,连接已被重置。
- WSAENOTSOCK
描述符不是套接字。
备注
备注
的 setsockopt的函数设置用于与任何类型的插座,在任何状态相关联的套接字选项的当前值。虽然选项可以存在于多个协议级别,但它们始终位于最上层的套接字级别。选项影响套接字操作,例如在正常数据流中是否接收到加急数据(例如,OOB数据),以及是否可以在套接字上发送广播消息。
有两种类型的套接字选项:启用或禁用特性或行为的布尔选项,以及需要整数值或结构的选项。要启用布尔选项,optval参数指向非零整数。要禁用选项optval指向等于零的整数。对于布尔选项,optlen参数应该等于sizeof(int)
。对于其他选项,optval指向包含该选项所需值的整数或结构,optlen是整数或结构的长度。
下表列出了setsockopt函数支持的一些常用选项。“类型”列标识由optval参数寻址的数据类型。“说明”列提供了有关套接字选项的一些基本信息。有关套接字选项和更详细信息(例如默认值)的更完整列表,请参阅“ 套接字选项”下的详细主题。
level = SOL_SOCKET
有关level = SOL_SOCKET的套接字选项的更完整和详细的信息,请参阅SOL_SOCKET套接字选项。
level = IPPROTO_TCP
此套接字选项包括与Windows Sockets 1.1的向后兼容性
有关level = IPPROTO_TCP的套接字选项的更完整和详细的信息,请参阅IPPROTO_TCP套接字选项。
level = NSPROTO_IPX
有关level = NSPROTO_IPX的套接字选项的更完整和详细的信息,请参阅NSPROTO_IPX套接字选项。
setsockopt不支持的BSD选项 如下表所示。
- SO_CONDITIONAL_ACCEPT
将此套接字选项设置为TRUE会延迟连接的确认,直到调用WSAAccept条件函数为止 。如果为FALSE,则在调用条件功能之前可以接受连接,但如果条件功能拒绝该呼叫,则连接将被断开。在调用listen函数之前必须设置此选项 ,否则返回WSAEINVAL。SO_CONDITIONAL_ACCEPT仅支持TCP和ATM。
默认情况下,TCP将SO_CONDITIONAL_ACCEPT设置为FALSE,因此默认情况下,将在WSAAccept条件函数被调用之前接受连接 。当设置为TRUE时,必须在TCP连接超时之内进行条件决定。CF_DEFER连接仍然会超时。
默认情况下,ATM将SO_CONDITIONAL_ACCEPT设置为TRUE。
- SO_DEBUG
如果应用程序设置了SO_DEBUG选项,Windows Sockets服务提供商将被鼓励(但不是必需)提供输出调试信息。用于生成调试信息及其形式的机制超出了本文档的范围。
- SO_GROUP_PRIORITY
保留以备将来使用套接字组。组优先级表示指定套接字相对于套接字组内其他套接字的相对优先级。值是非负整数,零对应于最高优先级。优先级值代表底层服务提供商关于如何分配潜在稀缺资源的提示。例如,当两个或更多个套接字都准备好传输数据时,最高优先级套接字(SO_GROUP_PRIORITY的最低值)应首先进行处理,其余的根据其相对优先级依次进行服务。
- SO_KEEPALIVE
应用程序可以通过打开SO_KEEPALIVE套接字选项来请求TCP / IP提供商启用TCP连接上的保持活动数据包。Windows Sockets提供程序不需要支持使用keep-alives。如果是这样,精确的语义是实现特定的,但应符合关于IETF网站上提供的RFC 1122中规定的Internet主机 - 通信层要求的第4.2.3.6节。(此资源只能用英文提供)
如果由于保持活动而导致连接丢失,则错误代码 WSAENETRESET将返回到套接字上正在进行的任何调用,并且随后的任何调用将随WSAENOTCONN失败。
如果对具有SO_KEEPALIVE的TCP套接字启用了保持活动,则默认TCP设置用于保持活动超时和间隔,除非通过使用SIO_KEEPALIVE_VALS选项调用WSAIoctl函数 来更改这些值。
- SO_LINGER
SO_LINGER选项控制未连接的数据在套接字上排队并执行closesocket时所采取的 操作。见 字关闭了,其中的SO_LINGER设置影响语义的方式描述 关闭套接字。应用程序通过创建LERER结构(由optval参数指向)来设置所需的行为 ,这些成员使用这些成员l_onoff和l_linger进行适当的设置。
- SO_REUSEADDR
默认情况下,不能绑定一个套接字(请参阅 bind)到已经在使用的本地地址。然而,有时,可能需要以这种方式重用地址。由于每个连接都由本地和远程地址的组合唯一标识,所以只要远程地址不同,就将两个套接字绑定到相同的本地地址就没有问题。要通知Windows Sockets提供程序,因为所需的地址已被另一个套接字使用,应该不会禁止套接字上的 绑定,所以应用程序应该在发布绑定之前为套接字设置SO_REUSEADDR套接字选项 。该选项仅在绑定时解释 。 在不绑定到现有地址的套接字上设置该选项是不必要和无害的。绑定后设置或重置该选项对此或任何其他套接字没有影响。
- SO_RCVBUF和SO_SNDBUF
当Windows Sockets实现支持SO_RCVBUF和SO_SNDBUF选项时,应用程序可以请求不同的缓冲区大小(更大或更小)。即使实施没有提供所请求的总额,对setsockopt的调用 也可以成功。应用程序必须使用相同的选项调用 getsockopt来检查实际提供的缓冲区大小。
- SO_RCVTIMEO和SO_SNDTIMEO
当使用 recv功能时,如果在SO_RCVTIMEO指定的时间段内没有数据到达,则 recv功能完成。在Windows 2000之前的Windows版本中,随后使用WSAETIMEDOUT,接收到的任何数据都将失败。在Windows 2000及更高版本中,如果在SO_RCVTIMEO 指定的时间内没有数据到达,则 recv函数返回WSAETIMEDOUT,如果接收到数据,则 recv返回SUCCESS。
如果发送或接收操作在套接字上超时,套接字状态是不确定的,不应该使用; 在这种状态下的TCP插座有可能导致数据丢失,因为操作可以在操作完成的同一时间被取消。
- PVD_CONFIG
此对象存储与s参数中指定的套接字相关联的服务提供商的配置信息。这种数据结构的确切格式是每个服务提供商所特有的。
- TCP_NODELAY
TCP_NODELAY选项特定于TCP / IP服务提供商。如果启用TCP_NODELAY选项(反之亦然),Nagle算法将被禁用。该过程涉及当有未确认的数据已经在飞行中或缓冲发送数据时缓冲发送数据,直到可以发送全尺寸数据包。强烈建议TCP / IP服务提供商默认启用Nagle算法,对于绝大多数应用协议,Nagle算法可以提供显着的性能增强。但是,对于某些应用程序,该算法可能会阻碍性能,TCP_NODELAY可用于将其关闭。这些是发送许多小消息的应用程序,并且维护消息之间的时间延迟。
示例代码
以下示例演示了setsockopt函数。
#ifndef UNICODE #define UNICODE #endif #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include < winsock2.h> #include < Ws2tcpip.h> #include <stdio.h> //链接ws2_32.lib #pragma comment(lib,“Ws2_32.lib”)int main(){ // ------------------------------------- - //声明变量 WSADATA wsaData; SOCKET ListenSocket; sockaddr_in服务; int iResult = 0; BOOL bOptVal = FALSE; int bOptLen = sizeof(BOOL); int iOptVal = 0; int iOptLen = sizeof(int); // --------------------------------------- //初始化Winsock iResult = WSAStartup(MAKEWORD (2,2),&wsaData); if(iResult!= NO_ERROR){ wprintf(L “Error at WSAStartup()\ n”); 返回 1; } // --------------------------------------- //创建一个监听套接字 ListenSocket =套接字(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(ListenSocket == INVALID_SOCKET){ wprintf(L “socket function failed with error:%u \ n”,WSAGetLastError()); WSACleanup(); 返回 1; } // --------------------------------------- //将套接字绑定到本地IP地址//和端口27015 hostent * thisHost; char * ip; u_short端口 端口= 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); iResult = bind(ListenSocket,(SOCKADDR *)&service,sizeof(service)); if(iResult == SOCKET_ERROR){ wprintf(L “bind failed with error%u \ n”,WSAGetLastError()); 关闭套接字(ListenSocket); WSACleanup(); 返回 1; } // --------------------------------------- //初始化变量并调用setsockopt。// SO_KEEPALIVE参数是一个套接字选项//使套接字在会话上发送keepalive消息//。SO_KEEPALIVE套接字选项//需要将一个布尔值传递给// setsockopt函数。如果为TRUE,则套接字//配置为发送keepalive消息,如果FALSE //套接字配置为不发送keepalive消息。//这段代码通过使用getsockopt函数检查套接字上的SO_KEEPALIVE的状态来测试setsockopt函数// 。 bOptVal = TRUE; iResult = getsockopt(ListenSocket,SOL_SOCKET,SO_KEEPALIVE,(char *)&iOptVal,&iOptLen); if(iResult == SOCKET_ERROR){ wprintf(L “getsockopt for SO_KEEPALIVE failed with error:%u \ n”,WSAGetLastError()); } else wprintf(L “SO_KEEPALIVE Value:%ld \ n”,iOptVal); iResult = setsockopt(ListenSocket,SOL_SOCKET,SO_KEEPALIVE,(char *)&bOptVal,bOptLen); if(iResult == SOCKET_ERROR){ wprintf(L “setsockopt for SO_KEEPALIVE failed with error:%u \ n”,WSAGetLastError()); } else wprintf(L “Set SO_KEEPALIVE:ON \ n”); iResult = getsockopt(ListenSocket,SOL_SOCKET,SO_KEEPALIVE,(char *)&iOptVal,&iOptLen); if(iResult == SOCKET_ERROR){ wprintf(L “getsockopt for SO_KEEPALIVE failed with error:%u \ n”,WSAGetLastError()); } else wprintf(L “SO_KEEPALIVE Value:%ld \ n”,iOptVal); 关闭套接字(ListenSocket); WSACleanup(); 返回 0; }
IrDA插座注意事项
在使用IrDA的Windows套接字开发应用程序时,请注意以下事项:
- 必须明确地包含Af_irda.h头文件。
- IrDA提供以下套接字选项:
值 类型 含义 IRLMP_IAS_SET* IAS_SET设置IAS属性
IRLMP_IAS_SET套接字选项使应用程序可以在本地IAS中设置单个类的单个属性。应用程序指定要设置的类,属性和属性类型。应用程序预期为传递的参数分配必要大小的缓冲区。
IrDA提供了一个存储基于IrDA的信息的IAS数据库。通过Windows Sockets 2接口可以访问对IAS数据库的访问,但这种访问通常不被应用程序使用,并且主要用于支持与不符合Windows Sockets 2 IrDA约定的非Windows设备的连接。
以下结构IAS_SET与IRLMP_IAS_SET setsockopt选项一起用于管理本地IAS数据库:
// #include <Af_irda.h>为此struct typedef struct _IAS_SET { u_char irdaClassName [IAS_MAX_CLASSNAME]; char irdaAttribName [IAS_MAX_ATTRIBNAME]; u_long irdaAttribType; 工会 { 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与IRLMP_IAS_QUERY setsockopt选项一起用于查询对等体的IAS数据库:
// #include <Af_irda.h>为此struct typedef struct _WINDOWS_IAS_QUERY { u_char irdaDeviceID [4]; char irdaClassName [IAS_MAX_CLASSNAME]; char irdaAttribName [IAS_MAX_ATTRIBNAME]; u_long irdaAttribType; 工会 { 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 * LPIASQUERY;
许多SO_级套接字选项对IrDA无效。只有SO_LINGER被特别支持。
Windows Phone 8: Windows Phone 8及更高版本上的Windows Phone Store应用程序支持此功能。
Windows 8.1和Windows Server 2012 R2:Windows 8.1,Windows Server 2012 R2和更高版本上的Windows Store应用程序支持此功能。
要求
最低支持客户端
Windows 8.1,Windows Vista [桌面应用程序| Windows Store应用程序]
最低支持服务器
Windows Server 2003 [桌面应用程序| Windows Store应用程序]
最低支持的手机
Windows Phone 8
头
- Winsock2.h
图书馆
- WS2_32.LIB
DLL
- WS2_32.DLL
也可以看看
- 捆绑
- 用getsockopt
- ioctlsocket
- IPPROTO_IP套接字选项
- IPPROTO_IPV6套接字选项
- IPPROTO_RM套接字选项
- IPPROTO_TCP套接字选项
- IPPROTO_UDP套接字选项
- NSPROTO_IPX套接字选项
- 插座
- 套接字选项
- SOL_APPLETALK套接字选项
- SOL_IRLMP套接字选项
- SOL_SOCKET套接字选项
- Winsock功能
- WSAAsyncSelect
- WSAEventSelect
- 的WSAIoctl
- WSANOTINITIALISED
在使用此功能之前,必须发生成功的 WSAStartup调用。
- WSAENETDOWN
网络子系统失败。
- WSAEFAULT
optval参数指向的缓冲区不在进程地址空间的有效部分或 optlen参数太小。
- WSAEINPROGRESS
正在进行阻止Windows Sockets 1.1呼叫,或者服务提供商仍在处理回调函数。
- WSAEINVAL
的电平的参数是无效的,或者在缓冲器中的信息指向的optval的参数是无效的。
- WSAENETRESET
设置SO_KEEPALIVE时,连接已超时。
- WSAENOPROTOOPT
该选项对于指定的提供程序或套接字是未知的或不受支持的(请参阅SO_GROUP_PRIORITY限制)。
- WSAENOTCONN
SO_KEEPALIVE设置后,连接已被重置。
- WSAENOTSOCK
描述符不是套接字。
备注
备注
的 setsockopt的函数设置用于与任何类型的插座,在任何状态相关联的套接字选项的当前值。虽然选项可以存在于多个协议级别,但它们始终位于最上层的套接字级别。选项影响套接字操作,例如在正常数据流中是否接收到加急数据(例如,OOB数据),以及是否可以在套接字上发送广播消息。
有两种类型的套接字选项:启用或禁用特性或行为的布尔选项,以及需要整数值或结构的选项。要启用布尔选项,optval参数指向非零整数。要禁用选项optval指向等于零的整数。对于布尔选项,optlen参数应该等于sizeof(int)
。对于其他选项,optval指向包含该选项所需值的整数或结构,optlen是整数或结构的长度。
下表列出了setsockopt函数支持的一些常用选项。“类型”列标识由optval参数寻址的数据类型。“说明”列提供了有关套接字选项的一些基本信息。有关套接字选项和更详细信息(例如默认值)的更完整列表,请参阅“ 套接字选项”下的详细主题。
level = SOL_SOCKET
有关level = SOL_SOCKET的套接字选项的更完整和详细的信息,请参阅SOL_SOCKET套接字选项。
level = IPPROTO_TCP
此套接字选项包括与Windows Sockets 1.1的向后兼容性
有关level = IPPROTO_TCP的套接字选项的更完整和详细的信息,请参阅IPPROTO_TCP套接字选项。
level = NSPROTO_IPX
有关level = NSPROTO_IPX的套接字选项的更完整和详细的信息,请参阅NSPROTO_IPX套接字选项。
setsockopt不支持的BSD选项 如下表所示。
- SO_CONDITIONAL_ACCEPT
将此套接字选项设置为TRUE会延迟连接的确认,直到调用WSAAccept条件函数为止 。如果为FALSE,则在调用条件功能之前可以接受连接,但如果条件功能拒绝该呼叫,则连接将被断开。在调用listen函数之前必须设置此选项 ,否则返回WSAEINVAL。SO_CONDITIONAL_ACCEPT仅支持TCP和ATM。
默认情况下,TCP将SO_CONDITIONAL_ACCEPT设置为FALSE,因此默认情况下,将在WSAAccept条件函数被调用之前接受连接 。当设置为TRUE时,必须在TCP连接超时之内进行条件决定。CF_DEFER连接仍然会超时。
默认情况下,ATM将SO_CONDITIONAL_ACCEPT设置为TRUE。
- SO_DEBUG
如果应用程序设置了SO_DEBUG选项,Windows Sockets服务提供商将被鼓励(但不是必需)提供输出调试信息。用于生成调试信息及其形式的机制超出了本文档的范围。
- SO_GROUP_PRIORITY
保留以备将来使用套接字组。组优先级表示指定套接字相对于套接字组内其他套接字的相对优先级。值是非负整数,零对应于最高优先级。优先级值代表底层服务提供商关于如何分配潜在稀缺资源的提示。例如,当两个或更多个套接字都准备好传输数据时,最高优先级套接字(SO_GROUP_PRIORITY的最低值)应首先进行处理,其余的根据其相对优先级依次进行服务。
- SO_KEEPALIVE
应用程序可以通过打开SO_KEEPALIVE套接字选项来请求TCP / IP提供商启用TCP连接上的保持活动数据包。Windows Sockets提供程序不需要支持使用keep-alives。如果是这样,精确的语义是实现特定的,但应符合关于IETF网站上提供的RFC 1122中规定的Internet主机 - 通信层要求的第4.2.3.6节。(此资源只能用英文提供)
如果由于保持活动而导致连接丢失,则错误代码 WSAENETRESET将返回到套接字上正在进行的任何调用,并且随后的任何调用将随WSAENOTCONN失败。
如果对具有SO_KEEPALIVE的TCP套接字启用了保持活动,则默认TCP设置用于保持活动超时和间隔,除非通过使用SIO_KEEPALIVE_VALS选项调用WSAIoctl函数 来更改这些值。
- SO_LINGER
SO_LINGER选项控制未连接的数据在套接字上排队并执行closesocket时所采取的 操作。见 字关闭了,其中的SO_LINGER设置影响语义的方式描述 关闭套接字。应用程序通过创建LERER结构(由optval参数指向)来设置所需的行为 ,这些成员使用这些成员l_onoff和l_linger进行适当的设置。
- SO_REUSEADDR
默认情况下,不能绑定一个套接字(请参阅 bind)到已经在使用的本地地址。然而,有时,可能需要以这种方式重用地址。由于每个连接都由本地和远程地址的组合唯一标识,所以只要远程地址不同,就将两个套接字绑定到相同的本地地址就没有问题。要通知Windows Sockets提供程序,因为所需的地址已被另一个套接字使用,应该不会禁止套接字上的 绑定,所以应用程序应该在发布绑定之前为套接字设置SO_REUSEADDR套接字选项 。该选项仅在绑定时解释 。 在不绑定到现有地址的套接字上设置该选项是不必要和无害的。绑定后设置或重置该选项对此或任何其他套接字没有影响。
- SO_RCVBUF和SO_SNDBUF
当Windows Sockets实现支持SO_RCVBUF和SO_SNDBUF选项时,应用程序可以请求不同的缓冲区大小(更大或更小)。即使实施没有提供所请求的总额,对setsockopt的调用 也可以成功。应用程序必须使用相同的选项调用 getsockopt来检查实际提供的缓冲区大小。
- SO_RCVTIMEO和SO_SNDTIMEO
当使用 recv功能时,如果在SO_RCVTIMEO指定的时间段内没有数据到达,则 recv功能完成。在Windows 2000之前的Windows版本中,随后使用WSAETIMEDOUT,接收到的任何数据都将失败。在Windows 2000及更高版本中,如果在SO_RCVTIMEO 指定的时间内没有数据到达,则 recv函数返回WSAETIMEDOUT,如果接收到数据,则 recv返回SUCCESS。
如果发送或接收操作在套接字上超时,套接字状态是不确定的,不应该使用; 在这种状态下的TCP插座有可能导致数据丢失,因为操作可以在操作完成的同一时间被取消。
- PVD_CONFIG
此对象存储与s参数中指定的套接字相关联的服务提供商的配置信息。这种数据结构的确切格式是每个服务提供商所特有的。
- TCP_NODELAY
TCP_NODELAY选项特定于TCP / IP服务提供商。如果启用TCP_NODELAY选项(反之亦然),Nagle算法将被禁用。该过程涉及当有未确认的数据已经在飞行中或缓冲发送数据时缓冲发送数据,直到可以发送全尺寸数据包。强烈建议TCP / IP服务提供商默认启用Nagle算法,对于绝大多数应用协议,Nagle算法可以提供显着的性能增强。但是,对于某些应用程序,该算法可能会阻碍性能,TCP_NODELAY可用于将其关闭。这些是发送许多小消息的应用程序,并且维护消息之间的时间延迟。
示例代码
以下示例演示了setsockopt函数。
#ifndef UNICODE #define UNICODE #endif #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include < winsock2.h> #include < Ws2tcpip.h> #include <stdio.h> //链接ws2_32.lib #pragma comment(lib,“Ws2_32.lib”)int main(){ // ------------------------------------- - //声明变量 WSADATA wsaData; SOCKET ListenSocket; sockaddr_in服务; int iResult = 0; BOOL bOptVal = FALSE; int bOptLen = sizeof(BOOL); int iOptVal = 0; int iOptLen = sizeof(int); // --------------------------------------- //初始化Winsock iResult = WSAStartup(MAKEWORD (2,2),&wsaData); if(iResult!= NO_ERROR){ wprintf(L “Error at WSAStartup()\ n”); 返回 1; } // --------------------------------------- //创建一个监听套接字 ListenSocket =套接字(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(ListenSocket == INVALID_SOCKET){ wprintf(L “socket function failed with error:%u \ n”,WSAGetLastError()); WSACleanup(); 返回 1; } // --------------------------------------- //将套接字绑定到本地IP地址//和端口27015 hostent * thisHost; char * ip; u_short端口 端口= 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); iResult = bind(ListenSocket,(SOCKADDR *)&service,sizeof(service)); if(iResult == SOCKET_ERROR){ wprintf(L “bind failed with error%u \ n”,WSAGetLastError()); 关闭套接字(ListenSocket); WSACleanup(); 返回 1; } // --------------------------------------- //初始化变量并调用setsockopt。// SO_KEEPALIVE参数是一个套接字选项//使套接字在会话上发送keepalive消息//。SO_KEEPALIVE套接字选项//需要将一个布尔值传递给// setsockopt函数。如果为TRUE,则套接字//配置为发送keepalive消息,如果FALSE //套接字配置为不发送keepalive消息。//这段代码通过使用getsockopt函数检查套接字上的SO_KEEPALIVE的状态来测试setsockopt函数// 。 bOptVal = TRUE; iResult = getsockopt(ListenSocket,SOL_SOCKET,SO_KEEPALIVE,(char *)&iOptVal,&iOptLen); if(iResult == SOCKET_ERROR){ wprintf(L “getsockopt for SO_KEEPALIVE failed with error:%u \ n”,WSAGetLastError()); } else wprintf(L “SO_KEEPALIVE Value:%ld \ n”,iOptVal); iResult = setsockopt(ListenSocket,SOL_SOCKET,SO_KEEPALIVE,(char *)&bOptVal,bOptLen); if(iResult == SOCKET_ERROR){ wprintf(L “setsockopt for SO_KEEPALIVE failed with error:%u \ n”,WSAGetLastError()); } else wprintf(L “Set SO_KEEPALIVE:ON \ n”); iResult = getsockopt(ListenSocket,SOL_SOCKET,SO_KEEPALIVE,(char *)&iOptVal,&iOptLen); if(iResult == SOCKET_ERROR){ wprintf(L “getsockopt for SO_KEEPALIVE failed with error:%u \ n”,WSAGetLastError()); } else wprintf(L “SO_KEEPALIVE Value:%ld \ n”,iOptVal); 关闭套接字(ListenSocket); WSACleanup(); 返回 0; }
IrDA插座注意事项
在使用IrDA的Windows套接字开发应用程序时,请注意以下事项:
- 必须明确地包含Af_irda.h头文件。
- IrDA提供以下套接字选项:
值 类型 含义 IRLMP_IAS_SET* IAS_SET设置IAS属性
IRLMP_IAS_SET套接字选项使应用程序可以在本地IAS中设置单个类的单个属性。应用程序指定要设置的类,属性和属性类型。应用程序预期为传递的参数分配必要大小的缓冲区。
IrDA提供了一个存储基于IrDA的信息的IAS数据库。通过Windows Sockets 2接口可以访问对IAS数据库的访问,但这种访问通常不被应用程序使用,并且主要用于支持与不符合Windows Sockets 2 IrDA约定的非Windows设备的连接。
以下结构IAS_SET与IRLMP_IAS_SET setsockopt选项一起用于管理本地IAS数据库:
// #include <Af_irda.h>为此struct typedef struct _IAS_SET { u_char irdaClassName [IAS_MAX_CLASSNAME]; char irdaAttribName [IAS_MAX_ATTRIBNAME]; u_long irdaAttribType; 工会 { 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与IRLMP_IAS_QUERY setsockopt选项一起用于查询对等体的IAS数据库:
// #include <Af_irda.h>为此struct typedef struct _WINDOWS_IAS_QUERY { u_char irdaDeviceID [4]; char irdaClassName [IAS_MAX_CLASSNAME]; char irdaAttribName [IAS_MAX_ATTRIBNAME]; u_long irdaAttribType; 工会 { 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 * LPIASQUERY;
许多SO_级套接字选项对IrDA无效。只有SO_LINGER被特别支持。
Windows Phone 8: Windows Phone 8及更高版本上的Windows Phone Store应用程序支持此功能。
Windows 8.1和Windows Server 2012 R2:Windows 8.1,Windows Server 2012 R2和更高版本上的Windows Store应用程序支持此功能。
要求
最低支持客户端
Windows 8.1,Windows Vista [桌面应用程序| Windows Store应用程序]
最低支持服务器
Windows Server 2003 [桌面应用程序| Windows Store应用程序]
最低支持的手机
Windows Phone 8
头
- Winsock2.h
图书馆
- WS2_32.LIB
DLL
- WS2_32.DLL
也可以看看
- 捆绑
- 用getsockopt
- ioctlsocket
- IPPROTO_IP套接字选项
- IPPROTO_IPV6套接字选项
- IPPROTO_RM套接字选项
- IPPROTO_TCP套接字选项
- IPPROTO_UDP套接字选项
- NSPROTO_IPX套接字选项
- 插座
- 套接字选项
- SOL_APPLETALK套接字选项
- SOL_IRLMP套接字选项
- SOL_SOCKET套接字选项
- Winsock功能
- WSAAsyncSelect
- WSAEventSelect
- 的WSAIoctl
- UDP --02--UDP广播数据
- udp广播数据
- udp广播发送数据
- Android udp广播数据到外网
- UDP广播
- UDP广播
- udp广播
- UDP广播
- UDP广播
- UDP广播
- UDP 广播
- UDP广播
- UDP广播
- UDP广播
- udp广播
- udp广播
- UDP广播
- UDP广播
- java开发微信公众平台(一)-- 服务器配置
- Oracle 11G 虚拟列 Virtual Column
- 数据结构实验之求二叉树后序遍历和层次遍历
- 如何使用脚本批量创建虚拟机(上)
- 写给一名软件测试工程师
- UDP --02--UDP广播数据
- Python进阶(十二)-浅谈python中的方法
- 理解分布式一致性协议:二、三阶段提交
- Elasticsearch 5.x head插件安装指南 及问题
- C++内存布局(下)
- C#使用Log4net输出日志
- TWaver可视化编辑器(一)电信网管编辑器
- SparkStreaming读取kafka数据进行反序列化以及mapPartition优化实例
- Android Studio Facebook 第三方登录并上传360全景图片