嵌入式软件开发培训笔记——Linux网络编程及I/O模型

一、基础知识
    1、网络体系结构(协议模型)
        协议模型的特点
        OSI和TCP/IP协议模型
    2、TCP/IP协议模型
        分层介绍以及各层提供的主要功能
        每一层的典型协议
    3、TCP/IP的通信模型
        数据的打包和解包
        数据在网络节点之间的流动
    4、TCP和UDP协议
        TCP    UDP(可靠性的概念)
二、基于TCP/IP的编程

1、发送端:数据打包

2、接收端:数据解包

3、TCP/IP协议通信模型

4、TCP/IP结构

5、IP地址分类

6、IP地址转换

7、主机字节序(大端序&小端序)

8、网络字节序
    一个多字节整数在网络上传输时要按照统一的字节顺序发送和接收,该字节顺序称为网络字节序(NBO:Network Byte Order)。IP协议中定义大端序为网络字节序。
    编程约定:发送方在发送多字节整数之前要调用htonl()/htons()将数据从主机序转换为网络序;接收方收到一个多字节整数后要调用ntohl()/ntohs()将网络序转换到主机序后再使用。


9、TCP连接模型

9.1、SERVER API(服务器端API)
SYNOPSIS (1)         创建socket对象       
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);

SYNOPSIS (2)           绑定网卡(IP与端口号)
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>
       int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);


SYNOPSIS (3)            通知内核开始监听
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

SYNOPSIS (4)            block until connectin from client
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);    //client端IP地址

       #define _GNU_SOURCE             /* See feature_test_macros(7) */
       #include <sys/socket.h>

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

9.2、CLIENT API(客户端API)
SYNOPSIS                (5)client申请建立连接
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
(6)write()(7)read()(8)close—先关闭client,再关闭server

INADDR_ANY用于本机测试时替换IP地址的一个宏,基于linux的loop机制
9.3、TCP/UDP读写函数总结
    
write/read
最普通的读写函数,从文件IO中来,主要用于面向连接的TCP方式,并且在connection建立后使用。
send/recv
send/recv参数中不指定目的/来源的地址信息,所以主要用于面向连接的TCP方式,并且在connection建立后使用,因为此时对端地址信息已经得到并固定下来。
flag = 0时和write/read一致
sendto/recvfrom
sendto需要指定接收方的地址信息;而recvfrom会返回发送方的地址信息。
既可用于TCP也可用于UDP;但更多用于UDP,既非连接的模型。用于TCP时,和send/recv类似,因为不需要指定对端地址,所以最后两个参数可以为NULL和0。
send/recvmsg
最通用,适应各种连接模型,但使用中参数较为复杂,所以不常用。
注意:读写函数必须成对使用

10、UDP连接模型

11、TCP/UDP socket函数总结

12、循环服务器

13、常用工具

lsof    -p    进程号            //用于显示一个进程所打开的文件
netstat
抓包工具:
(1)图形工具wireshark
(2)命令行工具tcpdump
tcpdump    i    eth3(或lo..)    tcp    -w    /tmp/xxxfile.cap

14、I/O模型




open函数


EWOULDBLOCK等价于EAGAIN



服务器模型
   1、 循环服务器
    a、TCP循环服务器
    b、UDP循环服务器
   2、 并发服务器
    a、I/O多路复用并发服务器
    b、TCP并发服务器
    c、UDP并发服务器


查看协议 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值