hpsocket源码分析(hpsocket c#)
本文目录一览:
- 1、hp-socket 多线程怎么处理的
- 2、hp-socket supersocket 性能哪个好
- 3、发起socket连接的机器需要开端口吗? - PHP内核源码分析
- 4、c++ hpsocket发包去掉包头
- 5、linux源码分析
hp-socket 多线程怎么处理的
先创建线程A,线程中监听一个端口,等待客户端的连接。
如果客户端发来连接请求,线程A的监听处理会监听到,并得到对应的客户端的socket。
得到客户端的socket之后,新创建一个线程B,在线程B中使用客户端的socket进行通信(和客户端进行通信);
线程A在得到客户端socket之后,已经把socket转给了新线程(线程B)去处理了,线程A继续进行监听,等待下一个客户端连接。
如果再收到一个客户端的连接后,就再开一个新线程,去和客户端通信。
hp-socket supersocket 性能哪个好
SuperSocket(下文简称SS)是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。
无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。
发起socket连接的机器需要开端口吗? - PHP内核源码分析
不需要你可以做一个实验就清楚。windows
本地连接,属性,tcp/ip
,高级,选项,你只开放一个端口测试一下,一定可以上网的。所谓开端口的意思,就是一个程序,比如IIS,站用一个端口,比如80,这个端口等待别人连接。常规意义的开端口。是监控,等待别人的连接。是被别人连接的。而C/S的C端是主动发起的。端口数是随机的。操作系统分配的。严格的说,一个完整的网络会话,客户端需要端口,而不需要开放端口netstat??-a
-n
-o
就看到了
c++ hpsocket发包去掉包头
你好,直接上代码吧,会更加清晰一点。private void TCP_Pack_Server_Load(object sender, EventArgs e)
{
appState = AppState.Stoped;
SetControlState();
//绑定事件
//绑定监听地址前触发
server.OnPrepareListen += new TcpServerEvent.OnPrepareListenEventHandler(server_OnPrepareListen);
//客户端连接请求被接受后触发
server.OnAccept += new TcpServerEvent.OnAcceptEventHandler(server_OnAccept);
//发送消息后触发
server.OnSend += new TcpServerEvent.OnSendEventHandler(server_OnSend);
//收到消息后触发
server.OnReceive += new TcpServerEvent.OnReceiveEventHandler(server_OnReceive);
//连接关闭后触发(服务端的连接通常是多个,只要某一个连接关闭了都会触发)
server.OnClose += new TcpServerEvent.OnCloseEventHandler(server_OnClose);
//组件停止后触发
server.OnShutdown += new TcpServerEvent.OnShutdownEventHandler(server_OnShutdown);
//PACK模型包头格式
//XXXXXXXXXXXXX YYYYYYYYYYYYYYYYYYY
//前13位为包头标识,用于数据包校验,取值范围为0-8191(ox1FFF),当包头标识为0时不校验包头
//后19位为长度,记录包体长度。有效数据包最大长度不能超过524287(ox7FFFF)字节,默认长度限制为262144(ox40000)字节
//设置包头标识,客户端与服务端的包头标识一致才能通信
server.PackHeaderFlag = 0xff;
//设置包体长度
server.MaxPackSize = 0x1000;
}
linux源码分析
linux的tcp-ip栈代码的详细分析
1.数据结构(msghdr,sk_buff,socket,sock,proto_ops,proto)
bsd套接字层,操作的对象是socket,数据存放在msghdr这样的数据结构:
创建socket需要传递family,type,protocol三个参数,创建socket其实就是创建一个socket实例,然后创建一个文件描述符结构,并且互相建立一些关联,即建立互相连接的指针,并且初始化这些对文件的写读操作映射到socket的read,write函数上来。
同时初始化socket的操作函数(proto_ops结构),如果传入的type参数是STREAM类型,那么就初始化为SOCKET-ops为inet_stream_ops,如果是DGRAM类型,则SOCKET-ops为inet_dgram_ops。对于inet_stream_ops其实是一个结构体,包含了stream类型的socket操作的一些入口函数,在这些函数里主要做的是对socket进行相关的操作,同时通过调用下面提到的sock中的相关操作完成socket到sock层的传递。比如在inet_stream_ops里有个inet_release的操作,这个操作除了释放socket的类型空间操作外,还通过调用socket连接的sock的close操作,对于stream类型来说,即tcp_close来关闭sock
释放sock。
创建socket同时还创建sock数据空间,初始化sock,初始化过程主要做的事情是初始化三个队列,receive_queue(接收到的数据包sk_buff链表队列),send_queue(需要发送数据包的sk_buff链表队列),backlog_queue(主要用于tcp中三次握手成功的那些数据包,自己猜的),根据family、type参数,初始化sock的操作,比如对于family为inet类型的,type为stream类型的,sock-proto初始化为tcp_prot.其中包括stream类型的协议sock操作对应的入口函数。
在一端对socket进行write的过程中,首先会把要write的字符串缓冲区整理成msghdr的数据结构形式(参见linux内核2.4版源代码分析大全),然后调用sock_sendmsg把msghdr的数据传送至inet层,对于msghdr结构中数据区中的每个数据包,创建sk_buff结构,填充数据,挂至发送队列。一层层往下层协议传递。一下每层协议不再对数据进行拷贝。而是对sk_buff结构进行操作。