套接字

服务器模型——从单线程阻塞到多线程非阻塞(中)

旧时模样 提交于 2019-12-16 23:54:48
https://blog.csdn.net/wangyangzhizhou/article/details/78899629 前言的前言 服务器模型涉及到线程模式和IO模式,搞清楚这些就能针对各种场景有的放矢。该系列分成三部分: * 单线程/多线程阻塞I/O模型 * 单线程非阻塞I/O模型 * 多线程非阻塞I/O模型,Reactor及其改进 前言 这里探讨的服务器模型主要指的是服务器端对I/O的处理模型。从不同维度可以有不同的分类,这里从I/O的阻塞与非阻塞、I/O处理的单线程与多线程角度探讨服务器模型。 对于I/O,可以分成阻塞I/O与非阻塞I/O两大类型。阻塞I/O在做I/O读写操作时会使当前线程进入阻塞状态,而非阻塞I/O则不进入阻塞状态。 对于线程,单线程情况下由一条线程负责所有客户端连接的I/O操作,而多线程情况下则由若干线程共同处理所有客户端连接的I/O操作。 单线程非阻塞I/O模型 多线程阻塞I/O模型通过引入多线程确实提高了服务器端的并发处理能力,但每个连接都需要一个线程负责I/O操作。当连接数量较多时可能导致机器线程数量太多,而这些线程大多数时间却处于等待状态,造成极大的资源浪费。鉴于多线程阻塞I/O模型的缺点,有没有可能用一个线程就可以维护多个客户端连接并且不会阻塞在读写操作呢?下面介绍单线程非阻塞I/O模型。 单线程非阻塞I/O模型最重要的一个特点是

Java 网络编程

泄露秘密 提交于 2019-12-16 21:07:36
Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。 java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。 java.net 包中提供了两种常见的网络协议的支持: TCP :TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。 UDP :UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。 本教程主要讲解以下两个主题。 Socket 编程 :这是使用最广泛的网络概念,它已被解释地非常详细。 URL 处理 :这部分会在另外的篇幅里讲,点击这里更详细地了解在 Java 语言中的 URL 处理 。 Socket 编程 套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。 当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。 java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

Java语法进阶14-网络编程

时光怂恿深爱的人放手 提交于 2019-12-15 20:38:28
网络编程 软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。 B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。 网络通信协议 网络通信协议: 位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,它对数据的传输格式、传输速率、传输步骤等做了统一规定 TCP/IP协议: 它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,每一层都呼叫它的下一层所提供的协议来完成自己的需求 应用层:网络服务与最终用户的一个接口。协议有:HTTP、FTP、SMTP、DNS、TELNET、HTTPS、POP3等等。 表示层:数据的表示、安全、压缩。格式有:JPEG、ASCll、DECOIC、加密格式等。 会话层:建立、管理、终止会话。对应主机进程,指本地主机与远程主机正在进行的会话 传输层:定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP、UDP。 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。协议有:ICMP、IGMP、IP(IPV4 IPV6)、ARP、RARP。 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。 物理层:建立、维护、断开物理连接。 IP(internet

通用套接字选项和TCP套接字选项

我怕爱的太早我们不能终老 提交于 2019-12-14 03:28:13
1. 套接字选项函数原型: #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); ret-成功返回0 失败返回-1 2. 通用套接字选项: (1) SO_BROADCAST: 本选项开启或禁止进程发送广播消息的能力;只有数据报套接字支持广播,并且还必须是在支持广播消息的网络上; (2) SO_DEBUG: 本选项仅由TCP支持。当给一个TCP套接字开启本选项,内核将为TCP在该套接字和接收的所有分组保留详细跟踪信息。这些信息保存在内核的某个环形缓冲区中,并可以使用trpt程序进行检查; (3) SO_DONTROUTE: 本选项规定外出的分组将绕过底层协议的正常路由机制,以强制将分组从特定接口送出; (4) SO_ERROR: 当一个套接字上发生错误时,源自Berkeley的内核中的协议模块将该套接字的名为so_error的变量设为标准的Unix_Exxx值中的一个,我们称它为该套接字的待处理错误

C++ Socket编程之TCP实例(附C/C++代码详解)

眉间皱痕 提交于 2019-12-13 16:35:33
说明: 主要分步骤给出Windows平台下socket编程的一个TCP实例;使用WINDOWS下网络编程规范Winsock完成网络通信; 对程序各部分细节进行描述。 套接字有三种传输类型SOCK_STREAM SOCK_DGRAM SOCK_RAW; 具体见: https://blog.csdn.net/bjyddxhfxq/article/details/51119653 一、服务器 功能:监控端口,等待客户端的请求;建立连接成功后,服务器每输入一次数据,发送一组数据;若输入 q,则停止发送。 1、加载套接字库,创建套接字。 #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") //静态加入一个lib文件 WORD sockVersion = MAKEWORD(2, 2); WSADATA wsaData; if (WSAStartup(sockVersion, &wsaData) != 0) //WSAStartup返回0表示设置初始化成功 return 0; /*创建套接字*/ //AF_INET表示IPv4,SOCK_STREAM数据传输方式,IPPROTO_TCP传输协议; SOCKET listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if

socket套接字

非 Y 不嫁゛ 提交于 2019-12-13 12:51:01
socket 1,定义 套接字 基于tcp协议 socket是基于应用层与传输层之间的抽象层,是一组操作起来非常简单的接口,接收应用层的数据,然后传给操作系统 分类: 基于文件类型的套接字家族:AF-UNIX,不常用 基于网络类型的套接字家族:AF-INET 模块语法 shell:命令解释器,相当于调用cmd,执行指定的命令 stdout:正确结果以字符串的形式send个客户端 stderr:错误的结果以字符串的形式send给客户端 windows操作系统的默认编码是gbk 粘包 粘包的两种方式 连续短暂的多次send,数据量很小,数据就会统一发出去 send的数据过大,大于对方recv的上限时,对方第一次recv时,会接收上一次没有recv完的剩余数据,这就是粘包 只有tcp会粘包,udp永远不会粘包,粘包现象的发生于缓冲区有关系 缓存区 暂时储存一些数据 缓存取得存在,避免了网络波动等影响对数据传输的影响,保证了数据的收发稳定,匀速 缺点:就是照成了粘包现象 解决粘包现象 发送数据长度,客服端循环接收数据知道接收完数据 自定义报头 ftp协议 1,文件传输协议 FTP使用两个并行的TCP连接来传输文件,一个是控制连接(用于在两主机之间传递控制信息),一个是数据连接(用于实际传输一个文件)。因为FTP协议使用一个分离的控制连接,所以我们也称FTP的控制信息是 带外 传送的

基于java的简单Socket编程

时光毁灭记忆、已成空白 提交于 2019-12-11 20:41:55
1TCP协议与UDP协议 1.1 TCP TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。 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连接的请求。

socket通信的原理与实践

孤人 提交于 2019-12-11 20:29:37
主要参考了以下几篇博客,学到了很多,在这里总结一下 socket通信原理 TCP网络编程中connect()、listen()和accept()三者之间的关系 socket编程accept函数返回值的理解 TCP/IP协议是我们熟知的传输层协议,socket与TCP/IP协议模型的关系如下: Socket 是什么呢? Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。 简介Socket通信的全过程: 1.从服务器端说起,服务器端先初始化一个socket,调用bind()函数绑定一个端口 2.然后调用listen()函数监听端口,(相当于服务器的 客服是等待着客户(相当于客户端)电话的到来),listen() 函数的主要作用就是将套接字( sockfd )变成被动的连接监听套接字(被动等待客户端的连接),TCP 三次握手也不是由这个函数完成,listen()的作用仅仅告诉内核一些信息。 这里需要注意的是,listen()函数不会阻塞,它主要做的事情为,将该套接字和套接字对应的连接队列长度告诉 Linux 内核,然后,listen()函数就结束。 这样的话

本地套接字UDP连接,服务端出错退出后,再次启动服务端为什么会出现bind failed: Address already in use (98)的错误?

走远了吗. 提交于 2019-12-11 18:41:19
今天在敲基于UDP的本地套接字通信时,服务器传输数据出错后退出,再次启动服务器时出现了绑定失败的错误 之后,就通过netstat去查通信套接字的使用进程,查半天,诶?愣是没有! 我就奇了怪了咋回事,查询工作不到位?然后,楼主就重启虚拟机,再次通信,通信正常,退出后又不行了。我就去看我的代码和课程代码的区别,发现我在 声明套接字后就直接调用socket()函数初始化了 ,改正之后就能运行服务端客户端通信后,关闭,再开启正常!并且在建立连接后用之前的查询方法也是能查到使用通信套接字进程的。 但是,为什么直接初始化就不行,要声明后再初始化呢? 来源: CSDN 作者: forget_fish 链接: https://blog.csdn.net/forget_fish/article/details/103496113

hello/hi的简单的网络聊天程序

余生颓废 提交于 2019-12-11 15:12:53
hello/hi的简单的网络聊天程序 0 Linux Socket API Berkeley套接字接口 ,一个应用程序接口(API),使用一个Internet套接字的概念,使主机间或者一台计算机上的进程间可以通讯。 它可以在很多不同的输入/输出设备和驱动之上运行,尽管这有赖于操作系统的具体实现。 接口实现用于TCP/IP协议,因此它是维持Internet的基本技术之一。 它是由加利福尼亚的伯克利大学开发,最初用于Unix系统。 如今,所有的现代操作系统都有一些源于Berkeley套接字接口的实现,它已成为连接Internet的标准接口。 我们所用的Linux Socket API实际上就是 Berkeley Socket,下面给出一些建立TCP连接常用的Socket接口函数及其功能概要: socket() 创建一个新的确定类型的套接字,类型用一个整型数值标识( 文件描述符 ),并为它分配系统资源。 bind() 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,一个指定的本地端口和IP地址。 listen() 用于服务器端,使一个绑定的TCP套接字的tcp状态由CLOSE转至LISTEN;操作系统内核为此监听socket所对应的tcp服务器创建一个pending socket队列和一个established socket队列;参数backlog指定pending