socket网络通信的建立

  • socket文件描述符

socket文件描述符

在网络编程中socket通常被翻译为”套接字”,在Linux操作系统下,一切皆文件,所以套接字也称为一种文件描述符。
a)创建socket文件描述符

 #include <sys/types.h>          /* See NOTES */
 #include <sys/socket.h>
 int socket(int domain, int type, int protocol);  //成功返回文件描述符,失败返回-1

参数介绍:
domain:协议族的名字,如AF_INET为IPv4
type:通信类型,SOCK_STREAM(流通信),SOCK_DGRAM(数据段)
protocol:通常设为0
b)绑定IP

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);  
    //绑定的文件描述符   绑定的套接字地址  地址的长度
    //成功返回0,失败返回-1

备注:因为不同的协议族可以有不同的地址类型,所以通过指定一个公共结构体,强转换成该结构体的地址,并告诉该地址的长度。
c)客户端的连接过程

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//成功返回0,失败返回-1

connect的作用是用指定的套接字去连接指定的地址,对于面向连接的的协议,connect只能成功一次,因为已经建立连接了,对于非面向连接的协议(套接字类型为SOCK_DGRAM),可执行多次connect,以位这时的connect仅仅是设置了默认的目的地址。
对于TCP协议来说,connect实际上是要真正地进行三次握手,所以其默认是一个阻塞的操作。
d)服务端的连接过程
listen的使用

 #include <sys/types.h>          /* See NOTES */
 #include <sys/socket.h>
 int listen(int sockfd, int backlog);  //指定的文件描述符  监听的长度
 //成功返回0,失败返回-1

让服务器处于监听状态
accept的使用
用于从指定的套接字连接队列中取出第一个连接,并返回一个新的套接字与客户端通信,没有则阻塞。

 #include <sys/types.h>          /* See NOTES */
 #include <sys/socket.h>
 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
        //处于监听状态的文件描述符,保存对端的地址信息

TCP的连接过程(三次握手)
这里写图片描述
当客户端收到服务器端发送的SYN包后返回一个ACK应答,客户端进入ESTABLISHED状态,服务端收到ACK应答后,服务端进入ESTABLISHED状态,此时连接建立完成。

猜你喜欢

转载自blog.csdn.net/nuyexiaoxiang/article/details/80154745