套接字

Day04 (一)_TCP传输服务器端设计

给你一囗甜甜゛ 提交于 2020-01-31 14:37:08
前言 IP 地址的作用是唯一识别网络中的主机, IP 位于网络层 协议 + 端口号:可以唯一识别主机中的应用程序(进程) 这样,利用三元组( IP 地址,协议、端口)就可以标识网络的进程,网络中的进程通信就可以利用这个标识与其他进程进通信。 套接字 Socket 的来龙去脉: socket 即是一种特殊的文件,一些 socket 函数就是对其进行的操作(打开、读 / 写 IO 、关闭),这些函数我们在后面进行介绍。在组网领域的首次使用是在 1970 年 2 月 12 日发布的文献 IETF RFC33 中发现的,撰写者为 Stephen Carr 、 Steve Crocker 和 Vint Cerf 。根据美国计算机历史博物馆的记载, Croker 写道:“命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。”计算机历史博物馆补充道:“这比 BSD 的套接字接口定义早了大约 12 年。 8.1 TCP/IP TCP/IP :传输控制协议 / 网络协议是指能在多个不同网络间实现信息传输的协议簇。本协议不仅仅指的是 TCP 和 IP 两个协议,还有 FTP 、 SMTP 、 TCP 、 UDP 、 IP 等协议构成的协议簇。 根据以上介绍,可以看出 TCP/IP 协议中包含有 UDP 协议,姑且可以这样认为: UDP 是 TCP

Tcp/Ip协议

假如想象 提交于 2020-01-31 07:22:32
网络由下往上分为: 物理层-- 数据链路层-- 网络层-- IP协议 传输层-- TCP协议 会话层-- 表示层和应用层-- HTTP协议 1、TCP/IP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开). 2、HTTP连接

[原创]Java生成Word文档

断了今生、忘了曾经 提交于 2020-01-31 04:49:30
  在开发文档系统或办公系统的过程中,有时候我们需要导出word文档。在网上发现了一个用PageOffice生成word文件的功能,就将这块拿出来和大家分享。 生成word文件与我们编辑word文档本质上是相同的,只不过在用程序生成word文档的时候换成了用代码来操作。下面的例子中主要有添加标题,正文(段落、字体、字号、倍行间距、对齐方式、首行缩进等),插入图片等操作。这里写的例子给出的内容只是PageOffice 组件生成word文件的部分方法,需要使用更多方法的还是要自己根据实际的需求去查看API。API地址:http://www.zhuozhengsoft.com/help/java3/index.html   查看com.zhuozhengsoft.pageoffice.wordwriter 包下的对象和方法是用来生成word文件的    那就直接先上代码吧: 1 PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request); 2 poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); 3 //创建WordDocument对象 4 WordDocument doc = new WordDocument(); 5 //设置内容标题 6 /

Linux Kernel 2.6.9源码分析 -- accept

冷暖自知 提交于 2020-01-31 03:20:25
Linux Kernel 2.6.9源码分析 – accept 先来看一下原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) sockfd :这个套接字用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接字关联。当然客户不知道套接字这些细节,它只知道一个地址和一个端口号。 addr :这是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址结构来描述的,用户应该知道这一个什么样的地址结构。如果对客户的地址不感兴趣,那么可以把这个值设置为NULL。 len :如同大家所认为的,它也是结果的参数,用来接受上述addr的结构的大小的,它指明addr结构所占有的字节个数。同样的,它也可以被设置为NULL。 下面来看看系统调用sys_accept asmlinkage long sys_accept ( int fd , struct sockaddr __user * upeer_sockaddr , int __user * upeer_addrlen ) { struct socket * sock , * newsock ; int err , len ; char address [ MAX_SOCK_ADDR ] ;

关闭套接字close还是shutdown

◇◆丶佛笑我妖孽 提交于 2020-01-30 14:24:55
close 这个函数会对套接字引用计数-1,一旦发现引用计数到0,就会对套接字进行彻底释放,并且会关闭tcp两个方向的数据流。 因为套接字可以被多个进程共享,你可以理解为我们给每个套接字都设置了一个积分,如果我们通过fork的方式创建了子进程,套接字积分+1,如果我们调用一次close,套接字积分-1 close函数具体是如何关闭两个方向的数据流呢? 在输入方向,系统内核会将该套接字设置为不可读,任何操作都会返回异常。 在输出方向,系统内核尝试将发送缓冲区的数据发送给对端,并最后向对端发送一个FIN报文,接下来如果再对该套接字进行写操作,则会返回异常。 如果对端没有检测到套接字已经关闭,还继续发送报文,就会收到一个RST报文,告诉对端:“Hi,我已经关闭了,别再给我发送数据了”。 shutdown shutdown可以关闭一个连接的方向 int shutdown(int sockfd, int howto) howto是这个函数的设置选项,它的设置主要有三个选项 SHUT_RD(0):关闭连接的读方向,对该套接字进行读操作直接返回EOF。从数据角度来看,套接字上接收缓冲区已有的数据将被丢弃,如果再有数据到达,会对数据进行ACK,然后悄悄丢弃。也就是说,对端还会收到ACK,在这种情况下不知道发送的数据已经被丢弃了。 SHUT_WR(1):关闭连接的写方向,这就是常被称为半关闭的连接

网络编程

梦想的初衷 提交于 2020-01-29 05:06:07
网络编程和套接字 网络编程:两台连网的计算机相互交换数据。 套接字:完成数据传输。 请求套接字创建过程 1.调用socket函数(安装电话机)创建套接字(接电话需要准备什么-安装电话机) 2.调用bind函数分配IP地址和端口(分配电话号码) 3.调用LIsten函数转为可接受请求状态(连接电话线) 4.调用accept函数受理请求的连接(接听电话) 打电话套接字 1.调用socket函数创建套接字 2.调用connect函数向服务器发送连接请求 面向连接的套接字 特点:1.传输过程中数据不会消失 2.按序传输数据 3.传输数据不存在边界 列如:两位工人在一条传输带中传递物品,只要传输带本身没有问题,就能保证数据不会丢失。同时较晚的数据不会先到达,传送带保证了数据的按顺序排列。 这种情况适于write和read函数:传输数据的计算机通过三次调用write函数传递了100字节的数据,但接受数据的计算机仅通过一次read函数调用了100个字节。 套接字的缓冲区read函数读取速度比接受数据的速度慢,则缓冲区可能被填满,此时套接字无法在接受数据,但不会发生数据丢失,套接字将停止传输。 面向消息的套接字 特点:1.强调快速传输而非传输顺序 2.传输的数据可能丢失也可能损失 3.传输的数据有数据边界 4.限制每次传输的数据大小 比如:用摩托车发往同一目的地的2件包裹无需保证顺序

select函数

倾然丶 夕夏残阳落幕 提交于 2020-01-29 02:55:29
select函数 select()函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生 或经历一段指定时间后才唤醒它 #include <sys/select.h> #include <sys/time.h> // 返回值:若有就绪描述符,则返回就绪描述符数目;若超时则返回0,出错返回-1 int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); select的参数: maxfdp1: 指定待测试的描述符个数,它的值是待测试的最大描述符加1 readset、writeset、exceptset: 指定让内核测试读、写、异常条件的描述符 异常条件: 某个套接字的带外数据到达 某个已置为分组模式的伪终端存在可以从其主端读取的控制状态信息 fd_set *: select使用的描述符集 系统提供了4个宏对描述符集进行操作: #include <sys/select.h> #include <sys/time.h> void FD_SET(int fd, fd_set *fdset); // 设置文件描述符集fdset中对应于文件描述符fd的位(设置为1) void FD_CLR(int fd, fd

进程间通信小结

瘦欲@ 提交于 2020-01-29 02:04:28
进程间通信: 1、进程间的数据共享: 管道、 消息队列、 共享内存、 Unix域套接字 易用性: 消息队列 > Unix域套接字 > 管道 > 共享内存(经常与信号量一起用) 效 率: 共享内存 > Unix域套接字 > 管道 > 消息队列 常 用: 共享内存、Unix域套接字 2、异步通信 信号 3、同步与互斥(做资源保护) 信号量 来源: https://www.cnblogs.com/y4247464/p/12239464.html

基础网络操作命令(11 个命令)

a 夏天 提交于 2020-01-28 02:59:29
telnet命令 telnet命令:使用 TELNET 协议远程登录。 ssh命令 ssh命令:openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器。 格式: ​ ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] ​ [-D [bind_address:]port] [-E log_file] [-e escape_char] ​ [-F configfile] [-I pkcs11] [-i identity_file] ​ [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] ​ [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] ​ [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] ​ [user@]hostname [command] 参数: 参数 作用 -1 强制使用ssh协议版本1; -2 强制使用ssh协议版本2; -4 强制使用IPv4地址; -6 强制使用IPv6地址; -A 开启认证代理连接转发功能; -a

网络套接字编程介绍

做~自己de王妃 提交于 2020-01-27 07:13:24
以下是阿鲤对套接字编程的一些理解性总结,希望对大家有所帮助;若存在错误,请慷慨指出; 1:套接字编程预备知识 2:socket api(套接字编程接口)介绍 3:udp协议的客户端/服务端的介绍实现 4:tcp协议的客户端/服务端的介绍实现 一: 套接字编程预备知识 1:ip地址 IP协议规定网络上所有的设备都必须有一个独一无二的IP地址,就好比是邮件上都必须注明收件人地址,邮递员才能将邮件送到。同理,每个IP信息包都必须包含有目的设备的IP地址,信息包才可以正确地送到目的地。同一设备不可以拥有多个IP地址,所有使用IP的网络设备至少有一个唯一的IP地址。换言之,可以分配多个IP地址给同一个网络设备,但是同一个IP地址却不能重复分配给两个或以上的网络设备。 目前使用最广泛的IP地址规则为IPV4,其使用32位二进制来规定,而截至2019年11月26日,全球所有43亿个IPv4地址已分配完毕,这意味着没有更多的IPv4地址可以分配给ISP和其他大型网络基础设施提供商;所以现在大部分上网均采用动态地址分配,即便如此依旧不够使用;虽然出现了IPV6,但是IPV6还在部署初期; 2:端口号 端口号是一个2字节16位的整数;端口号用来标识一个进程,告诉操作系统,当前这个数据要交给哪一个进程来处理;所以ip地址+端口号就可以标识出某一台主机上的某一个进程(程序); 注意