求IOCP客户端实现,基本原理

我看你有戏 2010-06-06 09:59:03
只要给我个用IOCP实现的客户端就可以了,服务器的自己有了的

但是不知道如何写客户端,呵呵,希望给我个简单的,原理懂了就行
...全文
470 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggt87125 2010-09-11
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 henry3695 的回复:]
难是不难,问题是要搞出来,呵呵,我查了些国外的网站,基本上是那个codeproject里面的一个例子

很多国内的网站都在抄这个例子,唉,这个例子里面代码很多,所以,我需要简单点的例子

今天总算被我自己东搞搞西搞搞,搞出来了,很爽的,需要自己解决粘包的问题


设计是这样的,客户端每隔50毫秒的样子,给服务器发送数据,服务器收到数据后马上发回客户端

运行效果可以看到明显的粘包……
[/Quote]

能问一下 怎么处理的 粘包的问题 能给下代码看看嘛 ?
我看你有戏 2010-06-10
  • 打赏
  • 举报
回复
难是不难,问题是要搞出来,呵呵,我查了些国外的网站,基本上是那个codeproject里面的一个例子

很多国内的网站都在抄这个例子,唉,这个例子里面代码很多,所以,我需要简单点的例子

今天总算被我自己东搞搞西搞搞,搞出来了,很爽的,需要自己解决粘包的问题


设计是这样的,客户端每隔50毫秒的样子,给服务器发送数据,服务器收到数据后马上发回客户端

运行效果可以看到明显的粘包,但是我知道处理了,

搞程序,我觉得是玩出来的,而不是一味专理论的东西,还有就是要看看老外的一些好的编程思路

比较编译器,c,c++全是老外发明的

就好比老外要学中国功夫一样,需要了解中国文化

拳连千遍,其艺自现

编程序也是一样,需要不停的debug

谢谢大家的支持,通信这块应该没啥大的问题了,接下来准备搭建游戏框架了
Eleven 2010-06-10
  • 打赏
  • 举报
回复
把Client搞成IOCP的也不是很难吧。。。
我看你有戏 2010-06-10
  • 打赏
  • 举报
回复
有谁可以实现啊
whgyyx 2010-06-07
  • 打赏
  • 举报
回复
客户端用IOCP也是很好的,便于统一代码。只是在98系统上不能用IOCP。
whgyyx 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 henry3695 的回复:]
一个包结构
|<---BYTE--->|<----DWOD--->|<----数据--->|
掩码 数据长度

理想的情况是,我调用一次nBytesSent = send(m_socket, szBuffer, szBufferLen, 0);
就把整个数据包都发送过去,但是有些网络情况下,可能一次发送会小于我这个包的整个长度

所以为了模拟网络不佳的情况,将一次发送控制在2……
[/Quote]

CSDN有时间会有这情况。
scq2099yt 2010-06-07
  • 打赏
  • 举报
回复
不知道为啥要客户端IOCP,这样岂不客户端也是服务器了?
lijianli9 2010-06-06
  • 打赏
  • 举报
回复
不用listen,只用把你connect成功的socket绑定到你前面创建的完全端口上就可以了,
nodiebirdcomeback 2010-06-06
  • 打赏
  • 举报
回复
客户端可以采用异步模型,如果基于窗口的应用可以使用WSAAsyncSelect模型,
如果是没有窗口的代码下运行可以考虑WSAEventSelect模型,当然可以考虑select模型
nodiebirdcomeback 2010-06-06
  • 打赏
  • 举报
回复
客户端什么模型都没问题呀
我看你有戏 2010-06-06
  • 打赏
  • 举报
回复
我只是想知道是如何实现的,然后可以加深对IOCP的理解
昨夜无风 2010-06-06
  • 打赏
  • 举报
回复
客户端就用其他方式也可以啊,这没有规定IOCP的客户端也要用IOCP吧!再说IOCP在客户端也发挥不了多大优势,除非你是1对多
klkvc386 2010-06-06
  • 打赏
  • 举报
回复
UP...............
为什么总是要让人登陆登陆的,CSDN是不是有什么特别设置,
回复一下要登陆一次,想发个新贴登陆 N 次,也没发成,
一按提交发帖,就跳到登陆那一页,真的挺麻烦的
倒不如可以让人可以自由选择要登录多长时间,比如 一个月,一年。。。

我看你有戏 2010-06-06
  • 打赏
  • 举报
回复
一个包结构
|<---BYTE--->|<----DWOD--->|<----数据--->|
掩码 数据长度

理想的情况是,我调用一次nBytesSent = send(m_socket, szBuffer, szBufferLen, 0);
就把整个数据包都发送过去,但是有些网络情况下,可能一次发送会小于我这个包的整个长度

所以为了模拟网络不佳的情况,将一次发送控制在20个字节,
这种循环发送的时候,服务器需要如何处理粘包呢

jackson35296 2010-06-06
  • 打赏
  • 举报
回复
客户端用IOCP意义何在?难道你客户端要连接N台服务器?通常就一个套接字,没必要用IOCP,如果一定要用的话,只能说是画蛇添足了
我看你有戏 2010-06-06
  • 打赏
  • 举报
回复
每次发送20个字节,结果有问题的
我看你有戏 2010-06-06
  • 打赏
  • 举报
回复

cIoCP.SendText("0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19\n");
cIoCP.SendText("20、21、22、23、24、25、26、27、28、29、30、31、32、33、34、35、36、37、38、39、40\n");

BOOL ClientIOCP::SendData(char *pData, int nLen)
{
int nBytesSent = 0 ;
//Send the message to the server, include the NULL as well
/*nBytesSent = send(m_socket, pData, nLen, 0);
if (SOCKET_ERROR == nBytesSent)
{
WriteToConsole("\nError occurred while writing to socket %ld.", WSAGetLastError());
return FALSE; //error
}
return TRUE;
*/

ASSERT(NET_DATA_LONGTH> (nLen+3 ) );
//byte 128 WORD longth;
char szBuffer[NET_DATA_LONGTH]={0};
BYTE* lpMask;
lpMask = (BYTE*)(szBuffer);
*lpMask = 128;

WORD* lpLen;
lpLen = (WORD*)(szBuffer+1);
*lpLen = nLen;

memcpy(szBuffer+3 ,pData,nLen );



const int nPernLen = 20;
int nSendLen = 0 ;
int n = 0;
while (nSendLen<nLen)
{
WriteToConsole("%d、发送数据\n",n++);
nBytesSent = send(m_socket, szBuffer+nSendLen, nPernLen, 0);
if (SOCKET_ERROR == nBytesSent)
{
WriteToConsole("\nError occurred while writing to socket %ld.", WSAGetLastError());
return FALSE; //error
}

nSendLen+=nBytesSent;
}

return TRUE;
}

BOOL ClientIOCP::SendText(char *pData)
{
return SendData(pData,strlen(pData)+1);
}


我看你有戏 2010-06-06
  • 打赏
  • 举报
回复
先谢了,粘包问题真是比较伤脑筋

客户端连续发两次数据包,服务器那边会有问题
soswaidao 2010-06-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lijianli9 的回复:]

不用listen,只用把你connect成功的socket绑定到你前面创建的完全端口上就可以了,
[/Quote]
说的很有道理

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧