network
文章平均质量分 61
ningto.com
个人站点:https://ningto.com
展开
-
封包和拆包
封包和拆包对于基于TCP开发的通讯程序,有个很重要的问题需要解决,就是封包和拆包.自从我从事网络通讯编程工作以来(大概有三年的时间了),我一直在思索和改进封包和拆包的方法.下面就针对这个问题谈谈我的想法,抛砖引玉.若有不对,不妥之处,恳求大家指正.在此先谢过大家了.一.为什么基于TCP的通讯程序需要进行封包和拆包.TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的转载 2011-10-24 12:43:56 · 2182 阅读 · 0 评论 -
libevent 多线程
一个线程一个event_base,代码仅做练习使用,没有考虑销毁。仅支持vs2012及以上。#pragma once#include #include #include #include #include #include "event2/event_struct.h" // for: struct eventstruct event_base;struct buffe原创 2014-01-28 12:13:30 · 2824 阅读 · 0 评论 -
libevent time
linux服务端,在有新连接进来的时候发送4字节的时间然后关闭连接。#include #include #include #include #include #include #include void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr,原创 2013-12-27 21:23:52 · 1208 阅读 · 0 评论 -
WSAAsyncSelect模型
这个模型跟窗口有关,它使用消息来进行通知的。如下是对话框客户端关键代码,连接的是一个echo服务端。首先,自定义一个消息WM_MYSOCKET,消息响应函数OnMySocketMessage,新建两个CListBox控件用来显示发送和接受数据,分别是:m_ctrlSend, m_ctrlRecv;// 产生随机字符串std::string BuildRandString(int nu原创 2013-04-21 22:09:43 · 1050 阅读 · 0 评论 -
获取socket远程和本地IP端口
IPV4:class Net{public: static int getPeerToString(SOCKET sock, std::string &ip, unsigned short &port) { struct sockaddr_storage sa; int salen = sizeof(sa); if (::getpeername(sock, (struct原创 2014-01-02 20:16:14 · 8602 阅读 · 0 评论 -
libevent chat
windows客户端代码,使用C++11新特性:为了在控制台输入消息的时候不影响接收,loop放在另外一个线程里// BaseLoopThread.h#pragma once#include #include #include #include struct bufferevent;class BaseLoopThread{public: typedef std:原创 2013-12-28 20:23:36 · 1546 阅读 · 0 评论 -
libevent discard
windows client:// evTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include #include #include #include "event2/event.h"#include "event2/bufferevent.h"#include "event2/b原创 2014-01-01 10:35:12 · 1616 阅读 · 1 评论 -
select 实现超时连接
int ConnectHasTimeout(SOCKET sock, const sockaddr *name, int namelen, int nsec){ int n; int error = 0; unsigned long flag = 1; ioctlsocket(sock, FIONBIO, (unsigned long*)&flag); if ((n = connect原创 2013-09-03 20:52:00 · 873 阅读 · 0 评论 -
WSAEventSelect模型
客户端程序:需要注意的是WSAWaitForMultipleEvents只能支持由WSA_MAXINUM_WAIT_EVENTS对象规定的一个最大值为64,因此最多只能支持64个套接字。对于写服务端程序而言是一大缺点。#pragma once#include #include #include #include #include class TcpClient{原创 2013-05-01 20:35:07 · 1040 阅读 · 0 评论 -
select模型
需要注意的是要将listenSock设置为非阻塞模式,这样在while(1)循环中accept才不会被阻塞。同时listenSock也要set到fdread中,如果不这样做的话,select只能监视到客户端的socket,当客户端没有进行任务IO操作的时候select返回值为SOCKET_ERROR会一直进行循环检测,这样是没必要的。如果有listenSock在fdread中,而又没有新的客户端接原创 2013-04-21 19:37:26 · 978 阅读 · 0 评论 -
libevent echo服务端程序
#include #include #include #include #include #include #include #include #include #include #define LISTEN_PORT 5100#define LISTEN_BACKLOG 32void read_cb(struct bufferevent *bufferEvent,原创 2013-05-01 20:54:01 · 1133 阅读 · 0 评论 -
多线程异步TCP客户端实现
其中使用到的其他头文件地址:线程:http://blog.csdn.net/tujiaw/article/details/8795014阻塞队列:http://blog.csdn.net/tujiaw/article/details/8779466消息:http://blog.csdn.net/tujiaw/article/details/8665610#define DISALL原创 2013-04-12 20:52:43 · 1801 阅读 · 0 评论 -
libevent timer定时器
每隔一秒循环执行回调函数#include #include struct cb_arg{ struct event *ev; struct timeval tv;};void timeout_cb(int fd, short event, void *params){ puts("111"); struct cb_arg *arg = (struc原创 2013-03-24 10:42:51 · 2941 阅读 · 0 评论 -
报文,封包与拆包问题
封包与拆包要用同样的方式,否则会因为计算机大小端的问题得不到正确的数据.封包如:方法一unsigned char *p1 = buffer;unsigned short num = 0x0615;*(unsigned short*)p1 = num;...方法二*p1++ = num>>8;*p1++ = num;...拆包如:方原创 2012-06-30 06:59:09 · 2127 阅读 · 0 评论 -
int64、double字节序转换(大小端)
#include #include // 包含windows.h就不要包含这个头文件了#pragma comment(lib, "Ws2_32.lib")struct int64tonet{ union { __int64 w_; int r_[2]; }w, r; int64tonet(__int64 i) { w.w_ = i; r.r_[0] = ht原创 2013-04-03 20:59:12 · 10046 阅读 · 2 评论 -
简单socket通信过程(TCP)
首先要链接库文件:Property->Linker->Input->Additional Dependencies中加入ws2_32.lib或者代码里加入:#pragma comment(lib, "Ws2_32.lib")先运行服务器端后运行客户端// 服务器端#include#includeusing namespace std;int _tmain(int argc原创 2011-09-27 23:05:48 · 1071 阅读 · 0 评论 -
tcp/ip 3次握手与4次分手
建立TCP连接步骤(如上图3次握手):1.服务器必须准备好接受外来的连接。这是通过调用socket、bind和listen函数来完成,称为被动打开;2.客户通过调用connect进行主动打开。这时客户TCP会发送一个SYN(表示同步)分节,告诉服务器将在(待建立的)连接中发送数据的初始序列号。一般情况下SYN分节不携带数据,它只含有一个IP头部、一个TCP头部及可能有的TCP选项;3.原创 2012-07-05 23:41:09 · 2362 阅读 · 0 评论 -
Rio包
// 读写网络套接字时,由于内部缓冲约束和较长的网络延迟会引起read和write返回不足值。// Rio包可以解决上述问题进行健壮地读和写#include #include #include ssize_t rio_readn(int fd, void *usrbuf, size_t n){ size_t nleft = n; ssize_t nread;原创 2012-03-31 12:32:53 · 2822 阅读 · 0 评论 -
windows channel
BlockQueue.h#pragma once#include "Common.h"#include "Condition.h"templateclass BlockQueue{public: BlockQueue() : mutex_() , notEmpty_(mutex_) { } void put(const T &t) { MutexLo原创 2014-03-31 23:24:30 · 71144 阅读 · 0 评论