【 getsockopt/setsockopt系统调用】
来源:互联网 发布:Windows鼠标指针 编辑:程序博客网 时间:2024/06/10 11:08
#include "common.h"void main() {//---------------------------------------// Declare variablesWSADATA wsaData;SOCKET ListenSocket;sockaddr_in service;//---------------------------------------// Initialize Winsockint iResult = WSAStartup( MAKEWORD(2,2), &wsaData );if( iResult != NO_ERROR )printf("Error at WSAStartup\n");//---------------------------------------// Create a listening socketListenSocket = 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 27015hostent* 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;}
【 getsockopt/setsockopt系统调用】
功能描述:
获取或者设置与某个套接字关联的选 项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当操作套接字选项时,选项位于的层和选项的名称必须给出。为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET。为了操作其它层的选项,控制选项的合适协议号必须给出。例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TCP。
用法:
int setsockopt(
__in SOCKET s,
__in int level,
__in int optname,
__in const char* optval,
__in int optlen
);
int getsockopt(
__in SOCKET s,
__in int level,
__in int optname,
__out char* optval,
__in_out int* optlen
);
参数:
sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
optname:需要访问的选项名。
optval:对于getsockopt(),指向返回选项值的缓冲。
对于setsockopt(),指向包含新选项值的缓冲。
optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。
对于setsockopt(),The size, in bytes, of the optval buffer.
level指定控制套接字的层次.可以取三种值:
1)SOL_SOCKET:通用套接字选项.
2)IPPROTO_IP:IP选项.
3)IPPROTO_TCP:TCP选项.
optname指定控制的方式(选项的名称),我们下面详细解释
optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换
选项名称 说明 数据类型
========================================================================
SOL_SOCKET
------------------------------------------------------------------------
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 允许调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关闭连接 struct linger
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDLOWAT 发送缓冲区下限 int
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_REUSERADDR 允许重用本地地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容 int
========================================================================
IPPROTO_IP
------------------------------------------------------------------------
IP_HDRINCL 在数据包中包含IP首部 int
IP_OPTINOS IP首部选项 int
IP_TOS 服务类型
IP_TTL 生存时间 int
========================================================================
IPPRO_TCP
------------------------------------------------------------------------
TCP_MAXSEG TCP最大数据段的大小 int
TCP_NODELAY 不使用Nagle算法 int
========================================================================
返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EBADF:sock不是有效的文件描述词
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sock描述的不是套接字
SO_RCVBUF和SO_SNDBUF每个套接口都有一个发送缓冲区和一个接收缓冲区,使用这两个套接口选项可以改变缺省缓冲区大小。
// 接收缓冲区
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));
注意:
当设置TCP套接口接收缓冲区的大小时,函数调用顺序是很重要的,因为TCP的窗口规模选项是在建立连接时用SYN与对方互换得到的。对于客户,SO_RCVBUF选项必须在connect之前设置;对于服务器,SO_RCVBUF选项必须在listen前设置。
- 【 getsockopt/setsockopt系统调用】
- setsockopt && getsockopt
- setsockopt & getsockopt
- setsockopt,getsockopt
- getsockopt/setsockopt
- setsockopt ,getsockopt
- linux系统编程之getsockopt/setsockopt 函数
- getsockopt 和 setsockopt
- getsockopt 和 setsockopt
- getsockopt()/setsockopt()函数
- getsockopt() setsockopt() ioctlsocket() 用法
- getsockopt,setsockopt用法小结
- getsockopt/setsockopt 函数说明
- getsockopt/setsockopt 函数说明
- getsockopt/setsockopt 函数说明
- getsockopt,setsockopt用法小结
- getsockopt,setsockopt用法小结
- getsockopt/setsockopt 函数说明
- 匈牙利命名法-西蒙尼的故事
- sql convert用法
- 二叉树的递归实现(一)
- Veritas Cluster Server for Oracle双机热备的配置
- XP设置多显示器
- 【 getsockopt/setsockopt系统调用】
- IOS 同步请求和异步请求
- 2013中国互联网哈哈榜之2:十大事件
- JAVA面试精选【Java基础第三部分】
- 本命年的感悟——Leo2013年终总结
- 致前苹果CEO:微软真没疯
- 程序员,你也该为自己想想未来了
- UML 工具 UMLet 试用
- IOS 请求服务器的两种方法GET 和 POST