资讯专栏INFORMATION COLUMN

socket和accept返回的套接字(fd)有什么区别

alexnevsky / 4226人阅读

摘要:定义返回出错成功套接口描述字套接字我在哪个端口功能给套接口分配一个本地协议地址。服务端的产生的套接字只是用来监听的,不能直接用于发送接收数据。

记录unix网络编程的复习之路 简单回顾下socket连接过程

socket() --得到fd!

 功能:指定了协议族(IPv4、IPv6或unix)和套接口类型(字节流、数据报或原始套接口)。但并没有指定本地协议地址或远程协议地址。
 定义:int socket(int family, int type, int protocol);
 返回:出错:-1
        成功:套接口描述字 (socket file descriptor)(套接字)sockfd

bind() --我在哪个端口?

 功能:给套接口分配一个本地协议地址。
 定义:int bind(int sockfd, const struct sockaddr *my_addr, int addrlen);

connect() --Hello!

 功能:建立与TCP服务器的连接
 定义:int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

listen() --有人给我打电话吗?

 功能:将未连接主动套接口的转换为被动套接口,指示内核接受对该套接口的连接请求。
 定义:int listen(int sockfd, int backlog);
 参数:
     - sockfd调用socket函数返回的文件描述符(套接字).
     - 未完成连接队列和已完成连接队列的上限.
        - 未完成连接队列 : 服务端还未完成三次握手全部过程的一个队列.
        - 已完成连接队列 : 服务端已经完成三次握手全部过程的一个队列, 等待accept函数从这个队列中返回下一个(返回其实是取出, 该套接字不在已完成队列中了)套接字.

accept() --"Thank you for calling port 3490."

 功能:accept函数从listen的已完成连接队列中返回下一个已完成连接, 也就是对端的套接字, 一个新的套接字. 当已完成连接队列的下一个完成 
      连接是空, 那么accept函数将被阻塞.
 定义:int accept(int sockfd, struct sockaddr *cliaddr, int* addrlen);
 返回:调用成功时返回: 1. cliaddr: 客户进程的协议地址和地址大小 2. 新套接口描述字

send() 和 recv() --Talk to me, baby!

close() --滚开!


socket()和accept()返回的fd 举个栗子:
一个客户端和一个服务端连接,双方socket产生各自的c_sock_fd和s_sock_fd;
s_sock_fd进行bind和listen后,accept准备接受客户端的连接请求;c_sock_fd调用connect请求连接服务端;
服务端接到请求产生accept_fd,届时accept_fd和c_sock_fd两个套接字可以通讯,而s_sock_fd则可以关闭;
客户端关闭close(c_sock_fd)后,服务端关闭所有未关闭的fd,通讯彻底断开。
ps:服务端的socket产生的套接字只是用来监听的,不能直接用于发送接收数据。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44030.html

相关文章

  • nodejs cluster模块分析

    摘要:而在进程执行把进程添加到调度器中时添加了一个回调函数,回调函数了一个带的消息,并且为,就是这个消息触发了发送的函数的执行。 最近做了点nodejs项目,对nodejs的cluster怎么利用多进程处理请求产生了疑问,于是着手进行了研究,之后发现这其中竟大有文章!一切还是先从遥远的TCP说起吧。。。 TCP与Socket 说到TCP,相信很多人都相当了解了,大学已经教过,但是又相信有很多...

    KnewOne 评论0 收藏0

发表评论

0条评论

alexnevsky

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<