int socket( int family, int type, int protocol);
返回:非负描述字-成功;-1-出错;
说明:如果将最后的协议设为0,则会选择所给的family与type组的系统的缺省值。
int connect( int sockfd, const struct sockaddr* servaddr, socklen_t addrlen );
返回:0-成功;-1-出错;
说明:
.客户在调用函数connect前不必非得调用bind函数,因为如果需要,内核会确定源IP地址,并选择一个临时商品号。
.此函数可能阻塞。
.如果是TCP套接口,调用connect函数将激发三路握手,其中出错返回可能有以下几种情况:
(1) 客户发出手SYN在中间路由上引发一个“destination unreachable“的ICMP错误。即SYN分节没有到达目的服务器,返回EHOSTUNREACH或ENETUNREACH错误。
(2) 客户没有收到SYN分节,75分钟后返回ETIMEDOUT错误。
(3) 对客户响应一个RST响应,客户收到后马上返回一个ECONNREFUSED错误。可能是没有监听的服务器,TCP想取消一个已有的连接,或者接收到一个根本不存在的连接上的分节。
int bind( int sockfd, const struct sockaddr* myaddr, socklen_t addrlen );
返回:0-成功;-1-出错;
说明:
.bind函数可以指定一个端口号,指定一个IP地址,指定一个端口号,可能两者都指定,也可以两者都不指定。如果不指定,内核将自动选择。
.端口的通配号为0,地址为INADDR_ANY,它在中指定,需要注意的是,在此头文件中定义的所有常值都是按照主机字节序来定义的,我们应该对这些常值都使用htonl。
.从bind函数返回的一个常见的错误是EADDRINUSE。
int listen( int sockfd, int backlog );
返回:0-成功;-1-失败;
说明:
.内核为任何一个监听套接口维护两个队列:一个是未完成连接队列,指的是客户发出并到到达服务器,而服务器正在等待完成三路握手的过程,这些套接口处于SYN_RCVD状态。第二个是已完成连接队列,这些套口处于ESTABLISHED状态。
.backlog曾被定义为这两个队列总和的最大值,沿用的代码总是给出值为5。对现在来说,显然不够,我们可以通过设定环境变量来覆盖调用者指定的值。eg:ptr=getenv("LISTENQ");backlog=atoi(ptr);
int accept( int sockfd, struct sockaddr* cliaddr, socklen_t *addrlen );
返回:非负描述字-成功;-1-出错;
说明:
.第三个参数为值-结果参数。
int close(int sockfd);
返回:0-成功;-1-失败;
说明:
.它包含在中,其它函数包含在中
int getsockname( int sockfd, struct sockaddr* localaddr, socklen_t* addrlen );
int getpeername( int sockfd, struct sockaddr* peeraddr, socklen_t* addrlen );
两者均返回:0-成功;-1-失败;
阅读(763) | 评论(0) | 转发(0) |