socket

蚂蚁二面,面试官问我零拷贝的实现原理,当场懵了…

若如初见. 提交于 2020-01-21 18:52:08
"狼哥,面试又跪了,碰到了知识盲区" "哪个?" "一面还可以,二面面试官问我零拷贝的原理,懵逼了...这块内容没去研究过" "哦,这个知识点,我之前应该有讲过,你没注意到?" "这东西工作中用不到,可能被我忽略了" "啧啧啧..." "哎,有空和我大概讲讲?" "先从简单开始,实现下这个场景:从一个文件中读出数据并将数据传到另一台服务器上?" "为啥写这个?" "你先写" "行..." 1分钟后 "我写了伪代码" File.read(file, buf, len); Socket.send(socket, buf, len); "这里涉及到了几次数据拷贝?" "2次?磁盘拷贝到内存,内存拷贝到Socket?" "emmm,怪不得挂了,一点不冤。" "这种方式一共涉及了4次数据拷贝,知道用户态和内核态的区别吗?" "了解" "行,文字有点干瘪,你先看这个图" image.png 1、应用程序中调用 read() 方法,这里会涉及到一次上下文切换(用户态->内核态),底层采用DMA(direct memory access)读取磁盘的文件,并把内容存储到内核地址空间的读取缓存区。 2、由于应用程序无法读取内核地址空间的数据,如果应用程序要操作这些数据,必须把这些内容从读取缓冲区拷贝到用户缓冲区。这个时候, read() 调用返回,且引发一次上下文切换(内核态->用户态)

【案例】多线程实现基于UDP协议的聊天器

限于喜欢 提交于 2020-01-21 11:34:54
博主前言: 在上一篇博客中,我讲述了用多线程的方式实现多任务,结合套接字编程的内容,我们已经具备了实现开发简单的基于UDP协议的聊天功能的程序,本来今天准备写一下多任务的另一种实现方式:多进程。但是今天事情有点多,写写停停思绪也没能集中,所以干脆停笔了,打算明天再写,加油! 整体逻辑: def main ( ) : # 1. 创建udp套接字 udp_socket = socket . socket ( socket . AF_INET , socket . SOCK_DGRAM ) # 2. 套接字绑定一个端口号 udp_socket . bind ( ( "" , 1314 ) ) # 3. 获得通信对方的ip和port dest_ip = input ( "请输入对方的ip:" ) dest_port = int ( input ( "请输入对方的port:" ) ) # 注意强制转换 # 4。 创建两个子线程,一个用于发送数据,一个用于接收数据 t_recv = threading . Thread ( target = recv_msg , args = ( udp_socket , ) ) t_send = threading . Thread ( target = send_msg , args = ( udp_socket , dest_ip , dest_port

c++ WebSocket Secure服务器(wss服务器)

时光怂恿深爱的人放手 提交于 2020-01-21 05:41:39
做h5游戏,之前是自己写的epoll网络通信,所以开始项目的时候都没有多想就直接自己写了一个websocket网络,而不是使用第三方的ws库。一直用都没有出现问题,但是项目上线前一周前端对接sdk的时候说平台只支持https不支持http,所以后端必须的使用wss通信,惊闻这个消息的时候已经周四了,离上线还有三天时间。想着如果用完全不了解的第三方库还不知道会出现什么问题,而且第三方库引入项目估计网络层全部都是修改,动静太大,时间上来不及,考虑之后还是决定自己写,自己用c++和openssl只用了一天时间就实现了,最后拿到线上也没有出现任何问题。下面简单介绍下wss的相关处理方式。wss其实就是在ws的基础上增加了一层ssl封装,所以听起来麻烦,真正实现其实不难。 首先分配和初始化服务器上下文句柄,代码如下: bool WSSSocketThread::Init() { SSL_library_init();//初始化库 SSL_load_error_strings();//加载错误信息 m_ctx = SSL_CTX_new(SSLv23_method());//SSLv23_server_method or SSLv23_client_method if (nullptr == m_ctx) { WRITE_ERROR_LOG("SSL_CTX_new error");

最简单的端口转发,反向通道

╄→尐↘猪︶ㄣ 提交于 2020-01-21 01:18:36
#pragma comment( lib, "ws2_32.lib" ) #include <windows.h> #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> #include <stdio.h> #include <winuser.h> DWORD WINAPI hrcv(LPVOID); DWORD WINAPI hsnd(LPVOID); SOCKET sock,new_fd; SOCKET sock2,new_fd2; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { struct sockaddr_in server,server2; DWORD threadid; WSADATA ws; struct hostent * iipp; WSAStartup( MAKEWORD(2, 2),&ws); if ((iipp=gethostbyname("xxxxxx.9966.org"))==0)return 0;////////////////// sock = socket(AF_INET, SOCK

网络编程——(5)TCP协议——多线程上传图片至服务端

主宰稳场 提交于 2020-01-20 22:15:49
在学习了TCP协议以后,我们可以做一些图片业务中简单的图片上传功能。 单机版的图片上传太鸡肋,一旦人数过多时,服务就会超时,所以就引入了多线程技术,多个线程处理不同的IP(主机)上传图片的业务。 首先看客户端: public class uploadpicThreadClient { public static void main(String[] args) throws IOException { //1、创建客户端socket Socket socket = new Socket("192.168.223.1", 9999); //2、读取客户端要上传的图片 FileInputStream fis = new FileInputStream("C:\\0.jpg"); //3、获取socket输出流,将读到的图片数据发给服务端 OutputStream outputStream = socket.getOutputStream(); byte[] buf = new byte[1024]; int len = 0; //使用输出流写出图片数据 while ((len = fis.read(buf)) != -1) { outputStream.write(buf, 0, len); } // 告诉服务端,客户端数据已发送完毕,服务端停止读取 socket

Linux网络编程 - 套接字和地址

﹥>﹥吖頭↗ 提交于 2020-01-20 20:22:03
1. socket 到底是什么? 在网络编程,socket,中文翻译为 套接字,有的时候也叫套接口 。它的寓意是通过插口接入的方式,快速完成网络连接和数据收发。可以把它从想象成现实世界的电源插槽,或者早起上网需要的网络插槽,所以 socket也可以看做是对物理世界的直接映射。 先上一张图,可以看看: 这张图是网络编程中,客户端和服务端工作的核心逻辑。先从右侧服务端开始看,因为在客户端发起连接请求之前,服务端必须先初始化好。首先初始化socket,之后服务器执行 bind() 绑定,将自己的服务能力绑定在一个众所周知的地址和端口上。紧接着,执行 listen() ,将原先的 socket转化为服务端的socket,服务端最后阻塞在 accept() 等待客户端请求的到来。 服务端准备就绪后,客户端需要先初始化 socket,再执行 connect() 向服务端的地址和端口发起连接请求,这里的地址必须是客户端预先知晓的。这个过程就是 TCP三次握手,具体的后面会详细阐述。 三次握手成功后,客户端和服务端之间就可以进行数据传输。具体来说,客户端向内核发起write字节流写操作,内核协议栈将字节流从网络设备发送到服务端,服务端从内核得到信息,将字节流从内核读到进程中,并开始业务逻辑的处理,完成之后,服务端再将得到的结果以同样的方式写回到客户端。可以看到, 一旦连接建立

(30)java中的网络编程

自古美人都是妖i 提交于 2020-01-20 19:06:44
网络编程的概述 网络通信协议 1,网络编程的目的: 直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯 2,网络编程中有两个主要的问题: ①,如何准确地定位网络上一台或多台主机,定位主机上的特定的应用 ②,找到主机后如何可靠高效地进行数据传输 3,通信要素一:IP和端口号 ①,IP:唯一的标识Internet上的计算机(通信实体) ②,在Java中使用InetAddress类代表IP ③,IP分类:IPV4和IPV6;万维网和局域网 IP地址的分类方式 IP地址分类方式1 : IPV4 和 IPV6 IPV4 :4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已 经用尽。以点分十进制表示,如192.168.0.1 IPV6 :128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示, 数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984 IP地址分类方式2 : 公网地址( 万维网使用)和 私有地址( 局域网使用) 。192.168. 开头的就是私有址址,范围即为192.168.0.0–192.168.255.255,专门为组织机 构内部使用 端口分类 : 公认端口 :0~1023。被预先定义的服务通信占用(如HTTP占用端口80) 注册端口 :1024~49151

C# Socket 通信

柔情痞子 提交于 2020-01-20 13:38:13
服务端 Service.cs using System ; using System . Collections . Generic ; using System . Net ; using System . Net . Sockets ; using System . Text ; using System . Threading ; using System . Windows . Forms ; namespace csharpService { public partial class Service : Form { public Service ( ) { InitializeComponent ( ) ; ///多线程编程中,如果子线程需要使用主线程中创建的对象和控件,最好在主线程中体现进行检查取消 /// CheckForIllegalCrossThreadCalls = false ; /// 获取本地IP textBox_current_address . Text = IPAddress . Any . ToString ( ) ; } /// 创建一个字典,用来存储记录服务器与客户端之间的连接(线程问题) /// private Dictionary < string , Socket > clientList = new Dictionary <

[ios5 cocos2d游戏开发实战] 笔记4 socket

二次信任 提交于 2020-01-20 11:23:44
socket 连接 SOCKET sock_client; sock_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == sock_client) { std::cout << "Invalid socket." << std::endl; WSACleanup(); return 0; } sockaddr_in addr_sev; addr_sev.sin_family = AF_INET; addr_sev.sin_port = htons(PORT_SERVER); addr_sev.sin_addr.s_addr = inet_addr("127.0.0.1"); if (SOCKET_ERROR == connect(sock_client, (sockaddr *)&addr_sev, sizeof(addr_sev))) { std::cout << "Failed to connect." << std::endl; WSACleanup(); return 0; } 使用 POSIX创建线程 参见ios笔记 线程 socket文件描述符 参考链接:http://blog.csdn.net/kjing/article/details/6962440

网络编程

房东的猫 提交于 2020-01-20 04:58:49
网络编程 1. 软件开发的架构 C/S架构 B/S架构 2. socket编程 2.1 socket通信流程 2.2 基于TCP协议的socket 2.3 基于UDP协议的socket 2.4 实例(初恋的故事) 2.5 实例(模拟qq聊天室) 3. 黏包现象 3.1 黏包成因 3.2 会发生黏包的两种情况 3.3 黏包的解决方案 4. socket的更多方法介绍 5. 验证客户端链接的合法性 6. socketserver 1. 软件开发的架构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用 第二种是web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用 这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构: C/S架构 C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。 这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。 B/S架构 B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。 Browser浏览器,其实也是一种Client客户端