原创 SOCKET函数

2009-7-2 19:13 2568 7 7 分类: 工程师职场

有时候我们要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要控制套接字的选项了.  





getsockopt和setsockopt



int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)

int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)



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

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



关于这些选项的详细情况请查看 Linux Programmer's Manual


****************************************************************************************************************




【 getsockname系统调用】  

   

功能描述:

返回指定套接字的名称。



用法:

#include <sys/socket.h>


int getsockname(int sock, struct sockaddr *name, socklen_t *namelen);




参数:  

sock:需要获取名称的套接字。

name:存放所获取套接字名称的缓冲区。

nemalen:作为入口参数,name指向空间的最大长度。作为出口参数,name的实际长度。



   

返回说明:  

成功执行时,返回0。失败返回-1,errno被设为以下的某个值  

EBADF:sock不是有效的文件描述词

EFAULT:name指向的内存并非有效的进程空间

EINVAL:namelen无效,可能为负值

ENOBUFS:执行操作时,系统资源不足

ENOTCONN:套接字尚未连接上

ENOTSOCK:sock描述的不是套接字




*************************************************************************************]




【 getpeername系统调用】  

   

功能描述:

获取另一端套接字的名称。



用法:

#include <sys/socket.h>


int getpeername(int sock, struct sockaddr *name, socklen_t *namelen);




参数:  

sock:与另一端连接的本地套接字。

name:存放返回名称的缓冲区。

namelen: 作为入口参数,指示name指向空间的最大长度。作为出口参数,指示所获取的名称的实际长度。



   

返回说明:  

成功执行时,返回0。失败返回-1,errno被设为以下的某个值  

EBADF:sock不是有效的文件描述词

EFAULT:name指向的内存并非有效的进程空间

EINVAL:namelen无效,可能为负值

ENOBUFS:执行操作时,系统资源不足

ENOTCONN:套接字尚未连接上

ENOTSOCK:sock描述的不是套接字


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条