• 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.

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

  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/DKSoft/p/3032034.html
Copyright © 2020-2023  润新知