网络编程套接字

预备知识:

1.端口号:

主机与主机之间的通信:

  • 网络协议中的下三层,主要解决的是数据可靠的运送到远端机器

  • 用户使用应用层软件,完成数据的发送和接收

网络间通信的本质:

进程间的通信

端口号:

  • 端口号是一个2字节16位的整数

  • 端口号是用来表示一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理

  • IP地址 + 端口号能够表示网络上的某一台主机的某一个进程

  • 一个端口号只能被一个进程占用

IP + port(端口号):套接字(socket)

2.端口号 vs pid

pid已经能够标识一台主机上进程的唯一性,为什么还要搞一个端口号?

  1. 不是所有的进程都要网络通信,但是所有进程都要有pid

  2. 系统和网络的功能解耦

3.一个进程可以绑定多个端口吗?可以的

一个端口号可以被多个进程绑定吗?不可以

对应 ip + port = 进程的例子:

传输层的协议的认识:

TCP:(传输控制协议)

  • 传输层协议

  • 有链接

  • 可靠传输

  • 面向字节流

UDP:(用户数据包协议)

  • 传输层协议

  • 无连接

  • 不可靠传输

  • 面向数据报

网络字节序:

内存中的地址有大端和小端之分,那么如何定义网络数据流的地址呢?

规定如下:

  • 发送主机通常将发送缓冲区的数据按内存地址从低到高的顺序发出

  • 接受主机把从网络上接到的字节依次保存在缓冲区中,也是按内存从低地址到高地址

  • 先发出的数据是低地址,后发出的数据是高地址

  • TCP\IP协议规定,网络数据流应采用大端字节序,即低地址高字节

socket编程接口:

套接字编程的种类:

1.域间(同一个机器内)

2.原始(编写网络工具)

3.网络(主要讲,用户间的网络通信)

前16位便是的是通信的类型。

对应判断类型的方式:

if(address->type == AF_INET) //网络

{

    

}

if(address->type == AF_UNIX) //原始

{

    

}

UDP服务器的代码实现:

认识接口:

创建套接字的接口。

绑定接口:

将struct sockaddr_和对应的套接字绑定。

接受:

对应从服务器或者用户中接入信息。

发送:

对应发送的接口。

接下来代码如下:

服务器代码:

其中注意的两个细节:

1.关于port:

[0,1023]:系统内定的端口:http:80,https:443

[1024,65535]:自己使用

如果是[0,1023]中的端口:

对应显示端口以定义,当然在root下面还是可以绑定成功的。

如果是[1024,65535]中的端口:

2.关于ip:

云服务器禁止直接绑定公网ip

只能通过默认路由地址进行绑定。

对应代码执行的结果:

如果不是默认路由(0.0.0.0):

如果是默认路由:

对应 netstat -nlup查看对应链接成功的服务器接口:

对应加上用户,让用户与服务器之间进行通信:

client要bind吗?

  • 要,只不过不需要用户显示的绑定,一般有系统自由随机选择。

  • 一个端口号只能被一个进程绑定,对server是如此们对于cilent也是如此

  • 其实client的port是多少,其实不重要,只要保证主机上的唯一性就可以了

  • 系统给用户的绑定的时间:首次发送的数据

对应打代码:

对应的结果:

对应用户法这么网络就会接受什么。

udp的三个应用场景:

1.指令系统

popen:

可以通过文件将读入的字符串直接转换为命令行命令:

对应的代码:

main.cc:

其中用绿色框柱的是修改的:

udpserver.hpp:

127.0.0.1:

本地环回地址,用本地第之间的信息传输。

2.2.windows和linux网络互聊:

需要在vs里面写对应的用户代码:

3.用户记录功能

客户端多线程化:

同时增加记录用户功能和用户广播功能:

UdpServer.hpp:

对应的inet_ntoa是将整形的ip地址转换为字符串。

Udpserverclient.cc:

对应使用了多线程将线程的属性封装成了结构体。

对应的结果:

对应将客户端向服务器的发送只会在服务器上出现了,因为进行了重定向:

对应的/dev/pts/2对应的就是终端。

对应的记录用户功能和用户广播:

关于inet_ntoa:

对应存在问题:

第二次调用会覆盖掉上次的结果。

解决方法:

inet_ntop.

tcp的通用服务器:

代码:

守护进程:
一个会话只能有一个前台进程在运行,键盘信号只能发给前台进程。

什么叫前台进程?

拥有键盘文件的进程就是前台进程

对应查找正在运行的进程指令:
jobs

对应将进程转变为前台进程:

fg

对应将进程转变为后台进程:

bg

进程组的概念:

对应多个任务,在同一个会话内启动的sid是一样的。

进程和任务的关系:

进程用来执行任务的。

对应创建好的进程收到了用户的登录和退出的影响,

会是所用的进程变为孤儿进程被系统回收。

守护进程的本质也是孤儿进程。

对应存在守护进程的接口:

tcp的三次握手和四次挥手

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值