zoukankan      html  css  js  c++  java
  • DelphiIOCP学习笔记<五>===测试IOCP工作线程处理队列顺序

    现在IOCP可以接收到数据了。

    >>>>>>>>>其实IOCP的队列是先进先出的,经过测试,看来是我记错了!!!!

    >>>>2013年4月20日 16:22:46

    >>>>>引用

    TCP数据粘包的产生原因在于TCP是一种流协议。在以太网中一个TCP的数据包长度是1500位。其中20位的IP包头,20位的TCP包头,其余的1460都是我们可以发送的数据

    >>>>>><http://fxh7622.blog.51cto.com/63841/15578>

    我在想如果客户端发送的数据如果比较小,会引起粘包的问题。粘包可以和客户端合订协议,可以解决,需要和客户端一起解决的问题,我想不应该放在IOCP的底层通信来实现!

    如果是客户端发送的数据过大呢,客户端是不是会分拆包来进行发送呢!

    IOCP的队列是 后进先出的模式,那会不会后面发送的包会被在前面接收到呢?

    我需要构思一下,怎么样来做这样的测试。

    2013年4月20日 11:03:13

    刚刚做了下测试,还是用了之前的例子

    1.我首先把工作线程调成了一个

    lvCount := 1;
    
      //ServerWorkerThread 是工作线程
      for I:=1 to lvCount do
      begin
         lvWorkerData := AllocMem(SizeOf(TWorkerData));
         lvWorkerData.IOCPHandle := lvIOPort;
         lvWorkerData.WorkerID := i;
         hThread := CreateThread(nil, 0, @ServerWorkerThread,
           lvWorkerData,0, dwThreadId);
         if (hThread = 0) then
         begin
             Exit;
         end;
         CloseHandle(hThread);
      end;

    2.服务端单独运行在,GetQueuedCompletionStatus,下断点,先不要执行。

    image

    3.单独运行客户端

    先创建连接,然后连续发送3次1024字节的字符。

    结果

      然后回到服务端调试。第一次取出来的字符,是客户端第一次发送过来的字符。。。顺序是对的

    难道不是后进先出。有时间向楠楠和fxh求证下。

    第二次测试

    开两个客户端。同样服务端只开一个工作线程。

    先在第一个客户端,发送1024个a,1024个b,1024个c

    再第二个客户端,发送1024个1,1024个2,1024个3

    回到服务端调试时,发现第一次收到的是a,第二次收到的是1,后面依次收到,b.

    可以看出同一个套件字的接收到的顺序是和发送的顺序是一致的,这样的话,我们可以每个套接字分配一个内存。将收到的数据按照套接字写入到这个内存中,就可以了。

  • 相关阅读:
    【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程
    modelsim使用常见问题及解决办法集锦③
    modelsim使用常见问题及解决办法集锦 ②
    KeepAlived双主模式高可用集群
    充分利用nginx的reload功能平滑的上架和更新业务
    nginx日志配置指令详解
    MongoDB 副本集
    MongoDB 备份还原
    MongoDB的搭建、参数
    mongoDB整个文件夹拷贝备份还原的坑
  • 原文地址:https://www.cnblogs.com/DKSoft/p/3032034.html
Copyright © 2011-2022 走看看