当使用 setsockopt 函数设置套接字选项时,你需要指定特定的选项名称和相应的值。以下是一些常用的选项名称和对应的枚举值功能列表:SO_REUSEADDR:允许地址重用。
/socket.h> int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen); int setsockopt 对于setsockopt(),指向包含新选项值的缓冲。 optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。 对于setsockopt(),现选项的长度。 函数功能: 获取或设置与某个套接字关联的选项。 ,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); //接收时限 setsockopt (socket,SOL_S0CKET,SO_RCVTIMEO,(char 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响 程序的性能: int nZero=0; setsockopt (socket,SOL_S0CKET,SO_SNDBUF,(char
默认的socket选项不够用的时候,就必须要使用setsockopt来调整。就是使用setsockopt。 首先看一下socket的setsockopt 函数的定义: socket.setsockopt(level,optname, value) Set the value of the given socket
以下资料均从网上收集得到 getsockopt 和 setsockopt 获得套接口选项: int getsockopt ( int sockfd, int level, int optname , void * optval, socklen_t *opteln ) 设置套接口选项: int setsockopt ( int sockfd, int level, int optname, group */ struct in_addr imr_interface; /* local IP address of interface */ }; 若进程要加入到一个组播组中,用soket的setsockopt 示例代码如下: intfd, on = 1; … /* 此处是创建套接字等操作,出于篇幅的考虑省略*/ … setsockopt (fd, SOL_TCP, TCP_CORK, fd, …); fprintf (fd, …); sendfile (fd, …); write (fd, …); sendfile (fd, …); … on = 0; setsockopt
函数原型 #include <sys/types.h > #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname (socket,SOL_S0CKET, SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); // 接收时限 setsockopt(socket,SOL_S0CKET (5)如果在发送数据时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能: int nZero=0; setsockopt(socket,SOL_SOCKET,SO_SNDBUF, (char *)&nZero,sizeof(int)); (6)同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区): int nZero=0; setsockopt int val = 5; setsockopt(fd, SOL_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val)); 打开这个功能后,内核在val时间之类还没有收到数据
// 测试setsockopt设置超时是否生效代码 #include <arpa/inet.h> #include <netinet/in.h> #include <stdlib.h> #include 超时 struct timeval timeout; timeout.tv_sec = 6; // 设定6秒超时 timeout.tv_usec = 0; ret = setsockopt = 0) { perror("setsockopt"); exit(1); } // 调用recv,期望预期的时间内超时 char buf
int setsockopt( SOCKET s, int level, int optname, const char* optval, int optlen ); s(套接字): 指向一个打开的套接口描写叙述字 二、使用样例说明 1.closesocket(一般不会马上关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt 假设在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响 程序的性能: int nZero=0; setsockopt(socket,SOL_S0CKET,SO_SNDBUF 假设要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:BOOL bDontLinger = FALSE;setsockopt(s,SOL_SOCKET 假设在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能:int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *
TCP端口复用引发的异常,用setsockopt来解决 我们在并发连接一个服务端时候他会出现这种情况 OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 假如端口被socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过一个TIME_WAIT的过程之后才能使用,这是TNN的相当烦银的,为了实现端口的马上复用,可以选择setsockopt 我们可以在定义好的端口加这句 from socket import server = socket() server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) server.bind
TCP端口复用引发的异常,用setsockopt来解决 我们在并发连接一个服务端时候他会出现这种情况 OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 假如端口被socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过一个TIME_WAIT的过程之后才能使用,这是TNN的相当烦银的,为了实现端口的马上复用,可以选择setsockopt 我们可以在定义好的端口加这句 from socket import server = socket() server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
问题背景 调用 setsockopt 设置 socket 属性失败,或者 getsockopt 获取 socket 属性失败。 2. 问题描述 调用 setsockopt、getsockopt 时返回 -1,且 errno 为 ENOPROTOOPT(92)。 3.
INADDR_ANY; mcast.imr_multiaddr.S_un.S_addr = ::inet_addr("234.5.6.7"); // 多播地址为234.5.6.7 ::setsockopt INADDR_ANY; mcast.imr_multiaddr.S_un.S_addr = ::inet_addr("234.5.6.7"); // 多播地址为234.5.6.7 ::setsockopt 有必要绑定到那个本地端口,而不是显示的指定本地地址 如果套接字使用SO_REUSEADDR选项,就可以不止一个进程可以绑定到UDP端口 如下代码所示: BOOL bReuse = TRUE; ::setsockopt SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0); // 允许其它进程使用绑定的地址 BOOL bReuse = TRUE; ::setsockopt INADDR_ANY; mcast.imr_multiaddr.S_un.S_addr = ::inet_addr("192.168.0.1"); // 多播地址为234.5.6.7 ::setsockopt
\n"); return -1; } /*设置socket描述符的选项*/ setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof (bufferSize)); setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); setsockopt (sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[1], SOL_SOCKET \n"); return -1; } /*设置socket描述符的选项*/ setsockopt(sockets[0], SOL_SOCKET (bufferSize)); setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); setsockopt
defined WIN64 || defined WINNT // use windows-specific time int32_t timeout = timeout_milli; setsockopt (tcpsocket->native_handle(), SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); setsockopt (tcpsocket->native_handle(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); setsockopt(tcpsocket->native_handle , (void*)&keepidle , sizeof(keepidle )); setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval )); setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount
\n”, WSAGetLastError()); return FALSE; } int optval = 1; if(setsockopt(m_sockRecv, SOL_SOCKET, SO_REUSEADDR , (char *) & optval, sizeof(optval)) == SOCKET_ERROR) { TRACE(“ERRROR : setsockopt(SO_REUSEADDR) – IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) & mcast, sizeof(mcast)) == SOCKET_ERROR) { TRACE(“ERRROR : setsockopt \n”, WSAGetLastError()); return FALSE; } //optval = 16; optval = 1; if (setsockopt(m_sockRecv, IPPROTO_IP , IP_MULTICAST_TTL, (char *) & optval, sizeof(optval)) == SOCKET_ERROR) { TRACE(“ERRROR : setsockopt
sendfd = Socket(AF_INET, SOCK_DGRAM, 0); recvfd = Socket(AF_INET, SOCK_DGRAM, 0); if(setsockopt (recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) perr_exit("setsockopt error. 22"); 192.168.17.129", &mreq.imr_interface.s_addr); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if(setsockopt (recvfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) <0)//接收套接字加入多播组 perr_exit("setsockopt error.35"); //setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &off, sizeof(off)); if(fork(
使用setsockopt()接口来设置与组播相关的属性。 setsockopt接口规范: #include <sys/socket.h> int setsockopt(int socket, int level, * Disable loopback so you do not receive your own datagrams. */ { char loopch=0; if (setsockopt MCAST_PORT = 5007 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt MCAST_PORT = 5007 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt
选项影响套接字操作,如 封包路由,OOB数据传输,获取和设置套接字选项分别是 getsockopt setsockopt 用法如下: int getsockopt(SOCKET s,int level ,int optname,char* optval,int* optlen); int setsockopt(SOCKET s,int level,int optname,char* optval,int 在指定的端口接收网络封包 如果封包还不到,设置套接字选项即可设置等待时间 BOOL SetTimeout(SOCKET s,int nTime,BOOL bRecv) { int ret = ::setsockopt
__s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 20) # self. __s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1) # self. __s.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, # socket.inet_aton(intf) + __s.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(SSDP_ADDR) + socket.inet_aton __s.setsockopt(socket.SOL_IP, socket.IP_DROP_MEMBERSHIP, socket.inet_aton(SSDP_ADDR) + socket.inet_aton
int uv__tcp_keepalive(int fd, int on, unsigned int delay) { if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE 因为这个配置在keep-alive关闭的时候是没用的 */ if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &delay, sizeof( err=sock->ops->setsockopt(sock, level, optname, optval, optlen); sockfd_put(sock 这就是为什么libuv调了两次setsockopt函数。第二次的调用设置了就是上面三个配置中的第一个(后面两个也可以设置,不过libuv没有提供接口,可以自己调用setsockopt设置)。 那么我们来看一下libuv的第二次调用setsockopt是做了什么。我们直接看tcp层的实现。
和 getsockopt 通过socket 实例 s 获取 的帮助如下: help(s.setsockopt) setsockopt(...) method of socket. _socketobject instance setsockopt(level, option, value) Set a socket option. 其中 setsockopt 和 getsockopt 中的 level、option 参数需要查看uninx 帮助手册去和获得相关信息 man 7 socket 可以看到相应的相关信息,其中有一段如下信息 : Socket options The socket options listed below can be set by using setsockopt(2) and read 启用端口重用: # 此时 socket 没有开启从用 srv.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 此时,再反复的执行此脚本