网络编程
SoulNov23
那些我们说着永远不分离的朋友,早已散落在天涯,时光的洪流中,我们总会长大。
展开
-
libevent使用event事件触发服务端实例
struct event_base* m_base = event_base_new();if (NULL == m_base){ return 1;}首先是创建base,后面的event都是基于base,关联到base才能进入循环。struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr原创 2016-11-05 17:03:37 · 2536 阅读 · 0 评论 -
非阻塞套接字connect
EINPROGRESS The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After...原创 2018-03-22 11:29:32 · 1800 阅读 · 0 评论 -
MQTT协议通俗讲解
原文链接:https://blog.csdn.net/u011216417/article/details/69666752参考 Reference协议文档 Offical Docsv3.1.1英文原版中文翻译版其他资源网站MQTT官方主页Eclipse Paho 项目主页测试工具MQTT Spy(基于JDK)...转载 2018-04-24 13:06:29 · 2313 阅读 · 0 评论 -
把函数返回值转为异常处理机制
我们这里要使用的是#include <stdexcept>,可以参考官方文档 先举一个例子,比如调用recv的函数返回值处理:int ret = recv(fd...);if (ret > 0){}if (ret == 0){}if (ret == -1){ //EAGAIN/EWOULDBLOCK提示你的应用程序现在没有数据可读请稍后再试 if (...原创 2018-09-04 13:00:17 · 835 阅读 · 0 评论 -
避免不必要的内存拷贝和清0
对于网络编程中,一般都喜欢使用memset清0和memcpy拷贝操作,举个例子:char buffer[1024];memset(buffer, 0, 1024);memcpy(buffer, proxy_hdr, IPC_HEADER_SZ);memcpy(buffer, trans_hdr, TRANMIT_HEADER_SZ);memcpy(buffer, buf, len);...原创 2018-09-09 21:50:57 · 1691 阅读 · 0 评论 -
udp接收缓冲设置多大
先说一下保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。这个机制决定了udp的特性: 1. udp可以多线程对同一个fd进行发包操作,如果是tcp多线程发送,会让流乱序,接收端完全无法解析出来 2. udp接收端每次只能拿到一个包,tcp需要借助自定义包头来拆分出一个一个的包假如现在发送端发送了长度为100,200,300的3个包,接收端需要调用3...原创 2018-09-09 23:08:49 · 9564 阅读 · 1 评论 -
map2str和str2map
举个例子:http://www.test.cn:8080/max/123.html?name=kevinchuang&pwd=123456#first通常http链接部分都是固定,我们需要关心的是从“?”到“#”部分的数据部分。比如现在我们要构造一个GET请求:string url = "http://www.test.cn:8080/max/123.html";url +=...原创 2018-11-03 18:55:06 · 688 阅读 · 0 评论 -
curl常用功能
最简单的get访问(-X GET可选):curl www.test.com使用用户名和密码:curl -u name:passwd http://www.test.com查看详细访问过程:curl -v www.test.compost访问(因为-d就指定了post,可以省略-X POST):curl -d "user=kevinchuang&passw...原创 2018-11-03 20:05:41 · 579 阅读 · 0 评论 -
curl源码编译安装
https://curl.haxx.se/download.html首先去curl官网下载对应版本,这里有个坑需要注意。如果下载的源码版本太高,编译是成功的,但是curl可执行文件访问https的时候还是会报各种奇怪的错误。所以我这里的做法是,先yuminstallcurl,然后curl -V看我的系统yum支持的curl最新版本。我这里是7.29.0这里点击OldRelease...原创 2019-03-27 16:02:28 · 19326 阅读 · 1 评论 -
protobuf使用方法
#!/bin/shSRC_DIR=./protocolDST_DIR=./cpp#C++protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/*.proto这是编译*.proto文件的脚本 这里我们用proto_class代替*.proto文件中的类结构 1.解析问题 char *str_buffer = new char[length]; pr原创 2016-10-10 09:54:22 · 3058 阅读 · 0 评论 -
python的libev库pyev一点心得
http://pythonhosted.org/pyev/examples.html 这是官方文档给的例子,基本需求对照着看了就可以写了,一般用事件模型,无非就是关心一个有连接可以accept,一个有数据可以read的事件,然后就是定时器,这里都有了。 1.例子中的reset函数 事件每次触发结束了,都要调用reset函数,reset函数的作用是重新注册一次事件,为什么要这么做了?以前用惯了l原创 2017-11-18 16:14:55 · 2640 阅读 · 0 评论 -
python使用epoll实现的服务端例子
#!/usr/bin/python# -*- coding: UTF-8 -*-import socketimport selectsend_data = "hello world!"send_len = len(send_data)recv_len = 1024tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)原创 2017-09-22 18:58:29 · 1177 阅读 · 0 评论 -
libevent多线程使用bufferevent的那些事
void do_accept(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *ctx){ //不使用Nagle算法,选择立即发送数据而不是等待产生更多的数据然后再一次发送 int optval = 1; setsockopt(fd, SO原创 2016-11-09 17:42:20 · 8009 阅读 · 12 评论 -
TCP连接的建立与终止
先附上正常连接和正常关闭情况下TCP状态变迁图 两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。TCP特意设计了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连接。 两个应用程序同时都执行主动关闭也是可能的,TCP协议也允许这样的同时关闭(simultaneous close) TIME_WAIT 1. TIME_WAIT状态也称为2MSL等待状态原创 2017-04-21 16:26:15 · 730 阅读 · 0 评论 -
socket套接字选项和模式
设置非阻塞windows的做法:u_long nonblocking = 1;ioctlsocket(fd, FIONBIO, &nonblocking);linux的做法int flags;flags = fcntl(fd, F_GETFL, NULL);fcntl(fd, F_SETFL, flags | O_NONBLOCK);设置FD_CLOEXECint flags;flag原创 2016-11-05 17:16:19 · 1261 阅读 · 8 评论 -
Linux下高并发socket,单机提供五十万连接
引用《Linux网络编程》一个完整的Socket描述,五元组,{协议,本地地址,本地端口,远程地址,远程端口}当我们自己写客户端测试程序来测试我们的服务端程序性能的时候,经常会遇到连接量上不去的问题,大多都是停留在2万左右。如果我们的测试机器有限,要想达到百万连接量的测试,那我们哪里去找50台测试机器了?实际的测试也不可能给50台测试机器。那么根据这个五元组,我们可以做一下文章。首先协议已原创 2016-07-14 11:13:52 · 4860 阅读 · 0 评论 -
从epoll源码分析它的使用
首先来看看epoll_create的真身SYSCALL_DEFINE1(epoll_create, int, size){ if (size <= 0) return -EINVAL; //也就是说参数size根本用不上 return sys_epoll_create1(0);}再来看看epoll_create1的真身SYSCALL_DEFINE1(epoll_c原创 2017-04-06 15:17:40 · 1510 阅读 · 1 评论 -
udp调用sendmsg报错Invalid argument
最近在写一个udp发送的时候冒出来一个错误,errno等于22,错误描述是Invalid argument,百度之后都是一些关于文件操作的错误,最后还是要靠自己。用strace跟进内核调用过程,也是没看出来什么。 可以看到,sendmsg所有参数完全正确,但是最后就是错误。 这个问题的主要点是对udp执行connect操作!connect并没有进行真正的连接操作(相对于tcp来说),而相当于给对原创 2017-08-04 10:27:15 · 8659 阅读 · 0 评论 -
python使用原始套接字发送二层包(链路层帧)
发送端代码:#!/usr/bin/python# -*- coding: UTF-8 -*-import socketimport structraw_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x1234))raw_socket.bind(("eth0", 0))packet = struc原创 2017-09-25 10:01:20 · 6482 阅读 · 2 评论 -
epoll的ET和LT模式下,accept,recv,send写法
epoll有两种事件模型: Level Triggered (LT) 水平触发 socket接收缓冲区不为空,有数据可读,读事件一直触发 socket发送缓冲区不满,可以继续写入数据,写事件一直触发 Edge Triggered (ET) 边缘触发 socket的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件 socket的发送缓冲区状态变化时触发写事件,即满的原创 2017-09-22 19:49:45 · 4751 阅读 · 2 评论 -
epoll的ET和LT模式触发场景
epoll有两种事件模型:Level Triggered (LT) 水平触发socket接收缓冲区不为空,有数据可读,读事件一直触发socket发送缓冲区不满,可以继续写入数据,写事件一直触发Edge Triggered (ET) 边缘触发socket的接收缓冲区状态变化时触发读事件socket的发送缓冲区状态变化时触发写事件总结:水平触发:只要可读,就一直触发读事件,只要可写,就...原创 2019-04-12 14:15:25 · 3182 阅读 · 10 评论