我正在尝试使用线程同时使用 5个线程发送 5个数据包 (制作可靠的UDP选择性重复协议我稍后会添加 确认并模拟损失)
我是socket编程的初学者,所以我不确定这种方法是否正确
所有数据包都被发送,然后我在客户端重新订购(附带序列号以便订购)
- 我将数据包分成byte []列表中的字节并添加序列号
- 将每个数据包传递给子线程中的子函数发送(MAX 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++;
}
答案 0 :(得分:1)
@Micky是的你是对的这种方式是错误的并且破坏了数据,解决方案是使用单个线程和单个套接字在正常循环中发送数据包,并使用线程进行定时器和仅确认