当前位置: 首页 > Linux

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

时间:2023-04-06 19:24:25 Linux

socket返回的socket(fd)和accept有什么区别?功能:指定协议族(IPv4、IPv6或unix)和套接字类型(字节流、数据报或原始套接字)。但是,既没有指定本地协议地址,也没有指定远程协议地址。定义:intsocket(intfamily,inttype,intprotocol);返回:错误:-1成功:套接字文件描述符(socket)sockfdbind()--我在哪个端口?功能:为套接字分配一个本地协议地址。定义:intbind(intsockfd,conststructsockaddr*my_addr,intaddrlen);connect()--你好!功能:与TCP服务器建立连接定义:intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);listen()--有人在叫我吗?功能:将未连接的主动套接字转换为被动套接字,指示内核接受对这个套接字的连接请求。定义:intlisten(intsockfd,intbacklog);参数:-sockfd调用套接字函数返回的文件描述符(套接字)。-未完成连接队列和已完成连接队列的上限。-Theincompleteconnectionqueue:服务端还没有完成整个三次握手过程的队列。-Completedconnectionqueue:服务器已经完成三次握手整个过程的一个队列,等待accept函数从这个队列中返回下一个(return实际上是取出来的,socket不在completedqueue中)socket.accept()--“感谢您调用3490端口。”作用:accept函数从listen的完成连接队列中返回下一个完成的连接,即peersocket字,一个新的socket。当已完成连接队列中的下一个已完成连接为空时,accept函数将被阻塞。定义:intaccept(intsockfd,structsockaddr*cliaddr,int*addrlen);返回:call成功时返回:1.cliaddr:客户端进程的协议地址和地址大小2.新的套接字描述符send()和recv()--Talktome,baby!close()--Fuckoff!socket()和accept()返回的fd就是一个例子:一个客户端连接到一个服务器,双方的socket生成各自的c_sock_fd和s_sock_fd;s_sock_fd绑定监听后,accept准备好接受客户端的连接请求;c_sock_fd调用connect请求连接服务器;服务器收到请求并生成accept_fd,然后accept_fd和c_sock_fd这两个socket可以通信,s_sock_fd可以关闭;客户端关闭close(c_sock_fd)后,服务端关闭所有未关闭的fd,通信完全断开。ps:服务器端socket生成的socket仅用于监听,不能直接用于发送和接收数据。