1、比如接收一个客户100字节的数据包,但WSARecv只收到50字节,是不是需要再投递一个WSARecv来接收剩余50字节?2、如上,有什么好的方案把两个包组成一个包.
struct SOCKET_CONTEXT
{
char szInBuffer[8192];
CCriticalSection m_ContextLock;
...............
};
这样好像可以,但不知道单个套接字接收顺序会不会乱呢?还有假如有5000个客户,那不是有5000个锁了?好像有点太多了吧!大家给说说下实现思路吧
struct SOCKET_CONTEXT
{
char szInBuffer[8192];
CCriticalSection m_ContextLock;
...............
};
这样好像可以,但不知道单个套接字接收顺序会不会乱呢?还有假如有5000个客户,那不是有5000个锁了?好像有点太多了吧!大家给说说下实现思路吧
所以,tcp通讯的时候,需要自己制定一个通信协议,在每个包的最前面添加当前包的总长度。2,5000个锁,5000个客户端,小意思啦。
=========广告签名==============
网上化妆品专卖小店
青春妆坊
http://shop33712512.taobao.com
=========广告签名==============
>>必须再次投递 WSARecv 接收剩余的50字节。
>>必须再次投递 WSARecv 接收剩余的50字节。
==========================
真的吗?
如果真的需要再投一次的话,那么我两次的不同数据岂不是要进行重组成一个完整的数据包了?
{
char szInBuffer[8192];
CCriticalSection m_ContextLock;
...............
};这里再加一个有效数据长度的标志,比如长度是len,那么每次WSARecv(szInBuffer+len)。
收到了数据就 len+=data_len , 等到收到了完整的一个整个数据包的时候再做处理。
这样做有个限制,就是数据包最大只能8192字节。对于一般的网游server程序来说,这样的数据包最大长度限制已经足够用了。==========广告签名============
http://shop33712512.taobao.com
淘宝店,专卖化妆品、自家蜂产品
==========广告签名============
2.TCP是不会乱序的。
3.锁的粒度得控制好。