网络编程

UDP网络编程
在这里插入图片描述

1、创建套接字 socket 文件描述符(客户端、服务器)
  • int socket(int domain,int type,int protocol);
    在这里插入图片描述
2、绑定地址信息(客户端、服务器)

PS:客户端一般不推荐用户手动绑定地址信息,如果未绑定而是在发送数据(send/sendto)的时候检测到socket还没有绑定地址信息,这时候操作系统会选择一个合适的地址端口进行绑定

  • int bind(int sockfd,const struct sockaddr* addr,socklen_t len);
    在这里插入图片描述
    在这里插入图片描述
3、数据发送(客户端、服务器)
  • size_t sendto(int sockfd, char* data,int len,int flag,struct sockaddr* daddr,socklen_t addrlen);
    数据发送时,先将数据发送到发送缓冲区,然后再通过网卡发送到对端主机。
    在这里插入图片描述
4、数据接收(客户端、服务器)
  • ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
    **PS:recvfrom是从接收缓冲区中取出数据,并不是调用recvfrom时才从网卡取出数据。**接收数据时,网卡接收到数据后就放入接收缓冲区。
    在这里插入图片描述
4、关闭套接字(客户端、服务器)
  • int closet (int fd);

TCP网络编程
在这里插入图片描述

服务端

1、创建套接字
  • int socket(int domain, int type, int protocol);
    PS:这个套接字只接收每个客户端第一次发送的SYN建立连接请求,后续的一系列响应与回复是通过 listen 时候创建的新套接字完成的。
2、为套接字绑定地址信息
  • int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
3、开始监听
  • int listen(int sockfd, int backlog);

    sockfd:套接字描述符
    backlog:同一时间的并发连接数,决定了同一时间最多有多少客户端可以建立连接(其实可以建立连接的客户端个数等于已完成连接队列的长度值等于backlog+1,所以已完成连接队列的长度为backlog+1。
    服务端在调用 listen 后,就告诉操作系统可以开始接收客户端的 connect 连接请求,并进行三次握手建立连接。在进行三次握手建立的过程中,当客户端向服务端发送SYN建立连接请求时,服务端收到这个SYN请求后会重新创建一个与刚开始创建的监听套接字相同的新的 socket 套接字,并在这个套接字当中增加了 dip(客户端ip) 和 dport(客户端port)。后续的两次握手以及后面的通信都由服务端新创建的 socket 套接字与客户端进行。
    在这里插入图片描述
    并且,在内核中还创建了两个 socket 队列:分别是 未完成连接队列、已完成连接队列

    • 上面提到客户端发送SYN请求之后,服务端为重新创建一个 socket 套接字用来后来的两次握手以及交流。当这个套接字创建完成以后,这个 socket 与 客户端还未成功建立三次握手,此时就会被添加到未完成连接队列中。当服务端收到客户端最后一次ACK回复以后,说明三次连接建立完成,则将这个套接字添加到已完成连接队列中。
      在这里插入图片描述
4、从已经完成连接队列中队首获取一个新的连接(阻塞操作)
  • int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

    sockfd:最开始创建套接字的那个文件描述符,也就是监听套接字的描述符。
    addr: 客户端的地址信息
    addrlen: 指定想要获取的地址信息长度,以及返回实际地址长度。

    返回值:返回新连接的套接字描述符(以后与客户端通信的的操作句柄)

5、数据接收
  • ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    在这里插入图片描述
6、数据发送
  • ssize_t send(int sockfd, const void *buf, size_t len, int flags);

PS:因为新创建的 socket 包含了一个完整的五元组,即知道了数据从哪里来,需要发往哪里去,所以接收和发送数据时候不需要指定对端或源端地址信息。

7、关闭套接字
  • int close( int fd)

客户端

1、创建套接字
  • int socket(int domain, int type, int protocol);
2、为套接字绑定地址信息(不推荐用户手动绑定,避免端口号冲突)
  • int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

    如果未绑定,在 connect 时候操作系统会选择一个合适的地址端口进行绑定。

4、向服务端发起建立连接请求
  • int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    sockfd:套接字描述符
    addr:服务端地址信息
    addrlen:服务端地址信息长度

5、发送数据
  • ssize_t send(int sockfd, const void *buf, size_t len, int flags);
6、数据接收
  • ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    在这里插入图片描述
7、关闭套接字
  • int close( int fd)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
linux C语言 网络编程教程及源码 一、网络应用层编程 1、Linux网络编程01——网络协议入门 2、Linux网络编程02——无连接和面向连接的区别 3、Linux网络编程03——字节序和地址转换 4、Linux网络编程04——套接字 5、Linux网络编程05——C/S与B/S架构的区别 6、Linux网络编程06——UDP协议编程 7、Linux网络编程07——广播 8、Linux网络编程08——多播 9、Linux网络编程09——TCP编程之客户端 10、Linux网络编程10——TCP编程之服务器 11、Linux网络编程11——tcp、udp迭代服务器 12、Linux网络编程12——tcp三次握手、四次挥手 13、Linux网络编程13——connect()、listen()和accept()三者之间的关系 14、Linux网络编程14——I/O复用之select详解 15、Linux网络编程15——I/O复用之poll详解 16、Linux网络编程16——I/O复用之epoll详解 17、Linux网络编程17——tcp并发服务器(多进程) 18、Linux网络编程18——tcp并发服务器(多线程) 19、Linux网络编程——tcp高效并发服务器(select实现) 20、Linux网络编程——tcp高效并发服务器(poll实现) 21、Linux网络编程——tcp高效并发服务器(epoll实现) 二、网络底层编程(黑客模式) 1、Linux网络编程1——啥叫原始套接字 2、Linux网络编程2——原始套接字编程 3、Linux网络编程3——原始套接字实例:MAC头分析 4、Linux网络编程4——原始套接字实例:MAC地址扫描器 5、Linux网络编程5——IP数据报格式详解 6、Linux网络编程6——TCP、UDP数据包格式详解 7、Linux网络编程7——原始套接字实例:发送UDP数据包 8、Linux网络编程8——libpcap详解 9、Linux网络编程9——libnet详解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值