使用多个线程在套接字中发送数据包

本文关键字:数据包 套接字 线程 | 更新日期: 2023-09-27 18:26:49

简介

例如,我正在尝试使用线程来发送5个数据包,同时使用5个线程(制作可靠的UDP选择性重复协议,我稍后将添加确认并模拟丢失)

我是套接字编程的初学者,所以我不确定这种方法是否正确

所有的数据包都被发送,然后我在客户端重新订购(附有要订购的序列号).

-我将数据包划分为byte[]列表中的字节,并添加序列号

-将每个数据包传递给新线程中的子函数进行发送(最多5个线程等待)当我使用一个线程发送文件时,发送成功但是当我使用5个线程发送相同的数据包时,文件就会损坏(数据加扰)

那么,当两个线程调用Socket.Send(data);

它同步吗?

我做了一些测试,结果如下当我在每个线程启动之间等待时。问题解决了(文件被成功接收)

我试着锁定发送函数,这样它一次只能被一个线程访问,但不起作用

代码的所有其他部分都经过了测试,所以我确信这是一个线程问题

那么我如何使用多个线程使用同一个套接字发送数据包呢

代码

      for (i = 0; i < pck_count; i++)
    {

  while (EMPTY_THREADS <= 0);//wait for any thread to finish
     //SIZE = windows size = is number of packets to send at one time =                     threads no
 //then try to send SIZE (5) packets from it: 
 int j = 0;
 for (j = 0; j < SIZE; j++)
 {

     if (j + i >= pck_count)
     {
         break;
     }
     //if packet not already sent , send it
     if (!status[i + j].sent && (j + i < pck_count))
     {
        // Console.WriteLine("Sending Packet:" + (i + j) );
         status[i + j].sent = true; //
         status[i + j].ack = true; // TO REMOVE 

         try
         {
             makeThread(Remote, j, i, newsocket);
          //   Thread.Sleep(150); // this makes it work   
         }
         catch (Exception e) {
             Console.WriteLine("ERROR:" + e.Message);
         }

     }


}

制作线程:

public static void makeThread(EndPoint Remote, int j,int i,Socket newsocket)
    {
        EMPTY_THREADS--;
        thread[j] = new Thread(
               () => startChild(msgs[i + j], Remote, j,newsocket));
        thread[j].Start();
    }

子级:

 static void startChild(myMessage packet, EndPoint Remote, int k,Socket newsocket  )
  {
   Console.WriteLine("Sending PACK" + packet.data.Length +" "+ packet.seq_no);
  byte[] data = new byte[1024];

       newsocket.ReceiveTimeout = 1000;
       int sentbytes = 0;
    `//convert packet from object to data array 
       data = serialize(packet);
       newsocket.Connect(Remote);
           sentbytes = newsocket.Send(data);
       //newsocket.Sendto(data,remote); //tried Sendto() with same effect
    //   newsocket.Close();
       EMPTY_THREADS++;
  }

使用多个线程在套接字中发送数据包

@Micky是的,你是对的,这种方式是错误的,会破坏数据,解决方案是使用单个线程和单个套接字在正常循环中发送数据包,并对计时器和仅确认使用线程