关闭

python使用原始套接字发送二层包(链路层帧)

发送端代码:#!/usr/bin/python # -*- coding: UTF-8 -*-import socket import structraw_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x1234)) raw_socket.bind(("eth0", 0)) packet = struc...
阅读(263) 评论(0)

[置顶] epoll的ET和LT模式下,accept,recv,send写法

epoll有两种事件模型: Level Triggered (LT) 水平触发 socket接收缓冲区不为空,有数据可读,读事件一直触发 socket发送缓冲区不满,可以继续写入数据,写事件一直触发 Edge Triggered (ET) 边缘触发 socket的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件 socket的发送缓冲区状态变化时触发写事件,即满的...
阅读(237) 评论(0)

python使用epoll实现的服务端例子

#!/usr/bin/python # -*- coding: UTF-8 -*- import socket import selectsend_data = "hello world!" send_len = len(send_data) recv_len = 1024 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)...
阅读(309) 评论(0)

udp调用sendmsg报错Invalid argument

最近在写一个udp发送的时候冒出来一个错误,errno等于22,错误描述是Invalid argument,百度之后都是一些关于文件操作的错误,最后还是要靠自己。用strace跟进内核调用过程,也是没看出来什么。 可以看到,sendmsg所有参数完全正确,但是最后就是错误。 这个问题的主要点是对udp执行connect操作!connect并没有进行真正的连接操作(相对于tcp来说),而相当于给对...
阅读(346) 评论(0)

TCP连接的建立与终止

先附上正常连接和正常关闭情况下TCP状态变迁图 两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。TCP特意设计了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连接。 两个应用程序同时都执行主动关闭也是可能的,TCP协议也允许这样的同时关闭(simultaneous close) TIME_WAIT 1. TIME_WAIT状态也称为2MSL等待状态...
阅读(244) 评论(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...
阅读(647) 评论(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...
阅读(1846) 评论(2)

recv和send的完整写法

struct evbuffer* input = evbuffer_new();//数据缓冲 void read_data() { char buffer[1024] = { '\0' }; int ret = recv(fd, buffer, 1024, 0); //从接收缓冲取数据成功 if (ret > 0) { evbuffer_add...
阅读(635) 评论(2)

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...
阅读(710) 评论(0)

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...
阅读(172) 评论(0)

libevent学习网站

http://www.monkey.org/~provos/libevent/doxygen-2.0.1/files.html...
阅读(130) 评论(0)

Windows网络编程Select模型的封装和queue作为数据缓存的使用

首先是对Select网络模型的封装,由于会用到数据缓存,所以接收到的数据需要对应一个socket套接字,这样回复数据的时候才知道对象。 #pragma once //存储从某个套接字接受到的数据,通过套接字可以发送处理后的数据 struct NetDataBuffer { char strBuffer[BUFFER_SIZE]; SOCKET sSocket; }; class CI...
阅读(466) 评论(0)

[置顶] Linux下高并发socket,单机提供五十万连接

引用《Linux网络编程》 一个完整的Socket描述,五元组,{协议,本地地址,本地端口,远程地址,远程端口} 当我们自己写客户端测试程序来测试我们的服务端程序性能的时候,经常会遇到连接量上不去的问题,大多都是停留在2万左右。如果我们的测试机器有限,要想达到百万连接量的测试,那我们哪里去找50台测试机器了?实际的测试也不可能给50台测试机器。那么根据这个五元组,我们可以做一下文章。首先协议已...
阅读(1452) 评论(0)