云计算百科
云计算领域专业知识百科平台

【服务器通信-accept】——int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

#include <sys/types.h>  

#include <sys/socket.h>

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd:

    socket文件描述符

addr:

    传出参数,返回链接客户端地址信息,含IP地址和端口号

addrlen:

    传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小

返回值:

    成功返回一个新的socket文件描述符,用于和客户端通信,失败返回-1,设置errno

解释分析:

三次握手过程

三次握手完成后,服务器调用accept()接受连接

如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。

addr是一个传出参数,accept()返回时传出客户端的地址和端口号。

如果给addr参数传NULL,表示不关心客户端的地址。

addrlen参数是一个传入传出参数(value-result argument),

传入的是调用者提供的缓冲区addr的长度以避免缓冲区溢出问题,

传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)

服务器程序结构:

while (1) {

    cliaddr_len = sizeof(cliaddr);

    connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);

    n = read(connfd, buf, MAXLINE);

    ……

    close(connfd);

}

整个是一个while死循环,每次循环处理一个客户端连接。

由于cliaddr_len是传入传出参数,每次调用accept()之前应该重新赋初值。

accept()的参数listenfd是先前的监听文件描述符

accept()的返回值是另外一个文件描述符connfd,之后与客户端之间就通过这个connfd通讯

最后关闭connfd断开连接,而不关闭listenfd

再次回到循环开头listenfd仍然用作accept的参数。

accept()成功返回一个文件描述符,出错返回-1。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【服务器通信-accept】——int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!