初见Linux-socket
2018-12-12 本文已影响0人
哇丶九夏
什么叫网络编程?
就是使用网络协议,进行网络通信。
数据报->UDP 流式套接字-> TCP 原始套接字-> RAW
4个层级
应用层
通信层
IP层
链路层
为什么要分层?
每层有具体负责的任务
- 网络接口层:MAC原地址 MAC目的地址 L/T 14字节的头。
MAC是网卡地址,解决的是链路层的数据传输问题(局域网点对点的数据传输)。
路由协议(BGP RIP OSPF)。 - 网络层:IP层,解决远程的网络传输问题。
- 传输层:TCP UDP ICMP 传输给哪个进程(应用程序)。端口,端口是哪个进程是用的。
-
应用层:传输的数据。
各个层的关系和大小
socket
![](https://img.haomeiwen.com/i9153402/a058ee3f42a683f7.png)
![](https://img.haomeiwen.com/i9153402/63f0acdb616aa4cf.png)
在Linux中socket是一个特殊的文件。
socket用来进行远程的数据发送和接收。
write -->socket
read -->socket
创建socket
-
socket函数原型
socket函数原型.jpg
-
第一个参数用来指明socket对象所使用的地址簇或协议簇。
参数1.png
-
第二个参数为socket的类型
参数2.jpg
socket(PF_INET,SOCK_STREAM,0); //IPV4 TCP
socket(PF_INET6,SOCK_DGRAM,0); //IPV6 UDP
socket(PF_INET,SOCK_RAW,PF_ICMP); //IPV4 原始套接字
设置socket
-
bind函数
bind函数原型.png
-
第二个参数是一个指向sockaddr结构的指针。struct sockaddr只是提供地址类型规范,根据不同的应用,sockaddr需要选用不同的类型。
参数2.png
- struct sockaddr 用来在函数间传递 struct sockaddr_in 用来使用数据的。
- inet_pton()把字符串地址转化成可用IP地址。
- 网络字节序转化函数:网络字节序<---->内存字节序
-本地转网络
htons -- short
htonl--int
-网络转本地
ntons -- short
ntonl -- int - 设置好之后需要开启服务器监听
listen(fd,LISTSIZE);
-监听句柄:同时监听等待多个新的链接。相当于邮局
-链接句柄:服务器和客户端的通信。相当于邮递员
使用socket
- accept
- write
- read