| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux操作系统 - 网络编程socket(1) -> 正文阅读 |
|
[系统运维]Linux操作系统 - 网络编程socket(1) |
目录 socket基本概念套接字(socket),站在Linux内核的角度来看,就是一个通信的端点。从Linux程序的角度来看,套接字就是一个有相应描述符的打开文件。 在通信的角度来看,大多数通信发生在不同的主机之间,其本质是进程间通信(所看到的公共资源就是网络)。ip地址可以标识全网内唯一的主机,而端口号port可以标识该主机上的唯一的一个进程(这里与进程的pid不一样)
所以可以说,套接字socket = ip + port; 由于套接字也是文件描述符,所以也有一些系统级IO是针对网路通信的 socket编程接口1、创建套接字第一个参数是指名通信域,也就是通信协议(协议家族sin_family中的成员)。 具体的有以下这些协议 常用的都是基于TCP/IP协议,所以选择AF_INET(IPV4) 或者AF_INET6(IPV6). 第二个参数是套接字的类型 其中有基于流式的SOCK_STREAM,基于数据报的SOCK_DGRAM。
第三个参数默认设置为0。 返回值 创建成功返回一个文件描述符,失败返回-1?。
输出为3,前面的0,1,2对应stdin,stdout,stderr。 2、绑定端口号和ip地址ip地址和端口号绑定在sockaddr_in结构体(针对IPV4)中 sin_family协议类型,上面已经说过,端口号port的大小是16位,ipv4的ip地址为?32位。针对这个结构有一个通用结构,struct sockaddr结构体 会发现接下来的函数bind,connect,accept都是用这个通用结构,因为不同的协议类型他的结构有所不同,只能用通用结构sockaddr,在传参是都需要强制类型转换为sockaddr*。在函数内部通过首部的地址类型来确定到底使用的是哪种结构。
bind函数 用来进行ip和端口号的绑定。绑定的目的是让内核将ip地址和端口号与socketfd进行联系起来(强相关),这个过程客户端和服务器都可以绑定,但是客户端没有必要与socketfd强相关,因为存在大量的客户端,而且客户端一般不会长时间连接服务器。而服务器正好相反,所以只针对服务器。
第一个参数就是创建好的套接字socket。 第二个参数就是sockaddr结构体指针。 第三个参数还需要传入结构体的大小。 绑定的过程:
udp服务器初始化结束之后需要进行通信,由于socket本质上是文件描述符,所以还需要两组IO 3、recvfrom函数与sendto函数recvfrom接收数据 在udp服务器里只讨论recvfrom函数,因为通过recvfrom函数还可以获得远端的地址数据。recv函数在tcp服务器里会经常出现。 recvfrom的第一个参数为socket,第二个参数为接收buffer,第三个为期望读到的长度,第四个参数是当没有数据时是阻塞等待还是非阻塞等待。后面两个参数是输出型参数,关心的是谁发给我的,也就是远端的地址数据。第六个参数一定要初始化,不然出bug。 sendto发送数据 和上面一样udp通信只关心sendto函数,前面几个参数是一样的道理,第五个参数是目的地址参数 写一个启动服务器start函数
用netstat查看当前操作系统的网络信息? -nlup中的n表示以数字的形式显示,u表示udp通信,p表示进程。发现当前网络多了一个ip地址为127.0.0.1,端口为8080的网络进程。 简易版的udp服务器大概就是这样,现在来看看客户端 客户端首先不需要进行bind操作,其他操作和服务器是一样的
客户端需要知道服务器的ip地址和端口号才能知道我要向谁通信。 ? 其实在服务器这边,不一定需要指定的ip地址,可以在s_addr里面填入INADDR_ANY这个选项,表示该主机上的任意ip地址来的数据都可以收到。 上面的小程序并没有连接,监听等操作,同样也说明udp是面向无连接的。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 22:28:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |