网络编程

Socket网络编程--小小网盘程序(5)

核能气质少年 提交于 2019-12-19 08:59:46
  各位好呀!这一小节应该就是这个小小网盘程序的最后一小节了,这一节将实现最后的三个功能,即列出用户在服务器中的文件列表,还有删除用户在服务器中的文件,最后的可以共享文件给好友。   列出用户在服务器中的文件列表   增加一个结构体 1 struct FileList 2 { 3 int cnt; 4 char list[16][128]; 5 };   为了方便我就假设服务器最多可以存16个单个用户的文件。如果想要支持更多的文件,这里可以增加一个int pages;用于分页作用,我们在服务器中获取文件时,可以根据分页进行发送。这样既方便又能支持多文件。   client.cpp这个客户端文件增加一个函数 1 int file_list(struct Addr addr,struct User user) 2 { 3 struct sockaddr_in servAddr; 4 struct hostent *host; 5 struct Control control; 6 struct FileList filelist; 7 int sockfd; 8 9 host=gethostbyname(addr.host); 10 servAddr.sin_family=AF_INET; 11 servAddr.sin_addr=*((struct in_addr *)host->h

枚举,网络编程

淺唱寂寞╮ 提交于 2019-12-19 04:15:05
文章目录 枚举 网络编程 InetAddress 描述ip地址的类 UDP编程 TCP编程 枚举 枚举: 列举出 有穷序列集 枚举类其实用了多例模式,枚举类的实例是有范围限制的。 enum类,反编译后就是一个 class 继承了Enum(注意:我们不能显示继承这个Enum), 如果枚举类里定义了抽象方法,他就是abstract类,如果没有抽象方法,他就由final修饰。final修饰的类不能被继承 enum Gender { MALE , FEMALE ; } 反编译后大概是这样, 必须看 public final class Gender extends java . lang . Enum { public static final Gender Male ; public static final Gender Female ; //为了确保只有固定个数对象且不能被修改,所以用static final修饰 private static final Gender [ ] $VALUES ; //这个是一个放所有枚举对象的数组,用values可以获取到。在编译阶段由编译器添加的,包括values()方法 static { //静态代码块,加载类的时候,就挨个创建每个枚举对象,并放进数组里。 Male = new Gender ( "Male" , 0 ) ; Female =

Socket网络编程--聊天程序(8)

倖福魔咒の 提交于 2019-12-19 02:58:17
  上一节已经完成了对用户的身份验证了,既然有了验证,那么接下来就能对不同的客户端进行区分了,所以这一节讲实现私聊功能。就是通过服务器对客户端的数据进行转发到特定的用户上,   实现私聊功能的聊天程序   实现的技术细节是:对客户端发送的数据增加一个标识头,由于我们处理的是纯文本,所以为了讲解的方便就把标识头加到聊天信息的前面,然后在服务器中判断。如果是要在做成产品的话,因为要考虑传送纯文本,图片,文件,特定的结构体等等其他非纯文本信息,那么我们可以对一次聊天信息,发送两次数据,第一次用TCP发送一个结构体,该结构体包含接下来要接收的信息的格式,大小等信息,然后第二次就发送真正的数据块。   关于第二次发送为什么要用UDP呢?这个是学腾讯qq的,因为标识结构体比较小,而且是必须要有的(为什么?)所以使用TCP,而信息那一部分,往往是数据比较大的,都用tcp传的话,会占用更多的资源。所以我们聊天的时候,有时候会出现这样一条信息,“由于网络问题,该信息可能发送失败”。想想,如果是tcp传输,那么就只有成功和失败,没有什么可能的问题,注意传文件是两个客户端进行tcp连接的,不然怎么确保正确性呢,哎,其实还是很复杂的。(真的吗?求辟谣!)   回到我们的程序中来吧,我的处理办法是在服务器里判断第一个单词是不是simple,如果是就读取第二个单词,为用户名,然后根据用户名从fd_C中查找

【网络编程】---C++实现原始套接字捕获数据包

被刻印的时光 ゝ 提交于 2019-12-19 02:40:04
【网络编程】—C++实现原始套接字捕获数据包 引言:原始套接字是允许访问底层传输协议的一种套接字类型,提供了普通套接字所不具备的功能,能够对网络数据包进行某种程度的控制操作。因此原始套接字通常用开发简单网络性能监视程序以及网络探测、网络攻击等工具。今天我们来探索一下,从实现原始套接字到捕获数据包的整个过程。 1.原始套接字与TCP套接字和UDP套接字的区别 Berkeley套接字将流式套接字和数据报套接字定义为标准套接字,用于在主机之间通过TCP和UDP来传输数据。为了保证Internet的使用效率,除了传输数据之外,操作系统的协议栈还处理了大量的非数据流量,如果程序员在创建应用时也需要对这些非数据流量进行控制的话,那么此时就需要另一种套接字,即原始套接字。这种套接字越过了TCP/IP协议栈的部分层次,为程序员提供了完全且直接的的数据包级别的Internet访问能力,如下图所示。 具有发送和接收ICMPv4、IGMPv4、ICMPv6等分组 具有发送和接收内核不处理其协议字段的IPv4数据包 可以控制IPv4首部 从图中我们可以清晰看出,对于普通流式套接字和数据包套接字的应用程序,他们只能控制数据包的数据部分,也就是除了传输层首部和网络层首部以外的,需要通过网络传输的数据部分。而传输层首部和网络层首部则由协议栈根据创建套接字时候指定的参数负责填充,显而易见的是,这两部分

Python网络编程之socket

岁酱吖の 提交于 2019-12-18 09:25:23
  socket是什么      Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏 在 Socket接口后面,对用户 来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。 套接字发展史及分类      基于文件类型的套接字家族   套接字家族的名字:AF_UNIX   unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信   基于网络类型的套接字家族   套接字家族的名字:AF_INET   (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET 是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)   套接字工作流程         套接字服务端   先从服务器端说起。服务器端先初始化 Socket

Python Socket 网络编程

非 Y 不嫁゛ 提交于 2019-12-18 02:02:47
原文: Python Socket 网络编程 Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了。 本文主要介绍使用 Python 进行 TCP Socket 网络编程,假设你已经具有初步的网络知识及 Python 基本语法知识。 TCP 是一种面向连接的传输层协议,TCP Socket 是基于一种 Client-Server 的编程模型,服务端监听客户端的连接请求,一旦建立连接即可以进行传输数据。那么对 TCP Socket 编程的介绍也分为客户端和服务端: 客户端编程 创建 socket 首先要创建 socket,用 Python 中 socket 模块的函数 socket 就可以完成: #Socket client example in python import socket #for sockets #create an AF_INET, STREAM socket (TCP) s = socket

网络编程

蓝咒 提交于 2019-12-17 22:57:02
架构 -- 程序员开发的一种模式 C/S架构 客户端/服务器模式 B/S架构 Browser浏览器/服务器模式 B/S架构的优势:统一了应用的接口 网络通信编程: 同一台电脑上两个py文件通信 --文件 两台电脑 如何通信 -- 一根网线 多台电脑 如何通信 -- 交换机 更多台电脑 如何通信 --交换机+路由器    mac地址:物理地址 在cmd查看命令 ipconfig -all mac地址是12位十六进制组成 ip地址:是一个四位点分十进制组成(ipv4) 端口 :操作系统为每个应用系统程序分配一个端口号 ip + 端口号 唯一确定某一个电脑上的某一个程序 arp协议:通过目标ip地址,获取目标mac地址 给你一个ip地址,如何确定他是不是你当前局域网内? ip地址 & 子网掩码 ex: ip地址 192.168.1.12 1100 0000.1010 1000.0000 0001.0000 1100 1111 1111.1111 1111.1111 1111.0000 0000 结果 1100 0000.1010 1000.0000 0001.0000 0000 ---> 192.168.1.1 网段 子网掩码 255.255.255.0 用网段来确定一个ip地址是否在你当前的局域网内 网段 = ip地址 & 子网掩码 路由器: 有一个路由表,记录了归它管理的所有的网段

[高并发Java 八] NIO和AIO

不问归期 提交于 2019-12-17 16:17:20
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> IO感觉上和多线程并没有多大关系,但是NIO改变了线程在应用层面使用的方式,也解决了一些实际的困难。而AIO是异步IO和前面的系列也有点关系。在此,为了学习和记录,也写一篇文章来介绍NIO和AIO。 1. 什么是NIO NIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标 准。它是在Java 1.4中被纳入到JDK中的,并具有以下特性: NIO是基于块(Block)的,它以块为基本单位处理数据 (硬盘上存储的单位也是按Block来存储,这样性能上比基于流的方式要好一些) 为所有的原始类型提供(Buffer)缓存支持 增加通道(Channel)对象,作为新的原始 I/O 抽象 支持锁(我们在平时使用时经常能看到会出现一些.lock的文件,这说明有线程正在使用这把锁,当线程释放锁时,会把这个文件删除掉,这样其他线程才能继续拿到这把锁)和内存映射文件的文件访问接口 提供了基于Selector的异步网络I/O 所有的从通道中的读写操作,都要经过Buffer,而通道就是io的抽象,通道的另一端就是操纵的文件。 2. Buffer Java中Buffer的实现。基本的数据类型都有它对应的Buffer Buffer的简单使用例子: package test; import

Linux多线程服务器端编程

泄露秘密 提交于 2019-12-17 14:03:31
目录 Linux多线程服务器端编程 线程安全的对象生命期管理 对象的销毁线程比较难 线程同步精要 借shared_ptr实现写时拷贝(copy-on-write) 多线程服务器的适用场合与常用编程模型 单线程服务器的常用编程模型 多线程服务器的常用编程模型 分布式系统中使用TCP长连接通信 C++多线程系统编程精要 高效的多线程日志 日志功能的需求 多线程异步日志 muduo网络库简介 TCP网络编程最本质的是处理三个半事件: 在一个端口上提供服务,并且要发挥多核处理器的计算能力 muduo编程示例 一种自动反射消息类型的Google Protobuf网络传输方案 短址服务 muduo库设计与实现 分布式系统工程实践 C++编译链接模型精要 Linux多线程服务器端编程 源码链接 。 muduo的编译安装 . 陈硕的编译教程 。 bazel编译文件不能有中文路径。 安装到指定目录: /usrdata/usingdata/studying-coding/server-development/server-muduo/build/release-install-cpp11/lib/libmuduo_base.a. 这本书前前后后看了三四遍,写得非常有深度,值得推荐。 编译和安装 . 线程安全的对象生命期管理 利用shared_ptr和weak_ptr避免对象析构时存在的竞争条件

socket网络编程

馋奶兔 提交于 2019-12-17 09:07:52
socket进程间的通信机制,也叫套接字。 tcp:3次握手,服务器安全稳定,但是效率低。 udp:快速效率高,但是不稳定,容易发生数据丢失,没有经历3次握手。 服务器端:socket(),bind()绑定监听端口,listen()设置监听队列, accept():在while(true)循环等待客户端连接,receive(),send(),close()。 客户端:socket(),connect()连接建立,send()发送数据,receive()接收数据,close()。 //socket网络编程 //服务器端 private void btnStart_Click(object sender, EventArgs e) {   try{ //当点击开始监听的时候,在服务器端创建一个负责监听IP地址跟端口号的socket     Socket socketWatch = new Socket(AddressFamily.InterNetwork, Socket T)     IPAddress ip = IPAddress.Any;//IPAddress.Parse(txtServer.Text); //创建端口对象     IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); //监听