В целях обучения я реализую UDP с помощью механизмов TCP (чтобы гарантировать безопасную передачу).Застрял в Interation, который защищен семафором
Semaphore
Я использую двоичный код, поэтому его sem = new Semaphore(1);
. Я использую этот семафор для управления входом для моего sendBuf
, который является List
, содержащий все пакеты, которые были отправлены, но еще не подтверждены. Поскольку я иногда удаляю пакеты из него, когда я получаю ACK, мне нужно убедиться, что я не перебираю один поток, а другой поток удаляет из него что-то.
Вещь, которая действительно прослушивал меня это:
public void timeoutTask(long seqNum) {
System.out.println("Timeout for package with SeqNum " + seqNum
+ " happened.");
timeoutValue *= 2;
try {
System.out.println("Acquire? in timeouttask");
sem.acquire();
System.out.println("Acquired! in timeouttask");
} catch (InterruptedException e1) {
System.out.println("semaphore not acquired");
e1.printStackTrace();
}for (FCpacket packet : sendBuf) {
System.out.println("Iterating!");
if (packet.getSeqNum() == seqNum) {
System.out.println("Package for seqNum " + seqNum + " found!");
reSendData = packet.getSeqNumBytesAndData();
DatagramPacket reSendPacket = new DatagramPacket(reSendData,
reSendData.length, hostaddress, SERVER_PORT);
try {
clientSocket.send(reSendPacket);
System.out.println("Packet with seq " + seqNum
+ " send again");
packet.setTimestamp(0);
startTimer(packet);
new ReceiveHandler(reSendData, reSendData.length,
clientSocket, rcvData, UDP_PACKET_SIZE, this).run();
} catch (IOException e) {
System.out.println("Couldn't send package");
e.printStackTrace();
}
}
}
sem.release();
System.out.println("released! in timeouttask");
Консольный вывод дает мне следующее:
Acquire? in timeouttask
Acquired! in timeouttask
Iterating!
Paket for seqNum 1 found!
Packet with seq 1 send again
Так он получает семафор, начинает итерацию, он даже посылает пакет, так что теперь это должно быть: Итерация снова («итерация!») ИЛИ освободить семафор. Ничего из этого не происходит, оно просто застряло. Я понятия не имею, почему - какие-то идеи?
Что вы имеете в виду «Я реализую UDP с механизмами TCP» ?? – SZD
только то, что я сказал в скобках. UDP не гарантирует, что пакеты поступают в пункт назначения, TCP проверяет, выполняются ли они, а если не отправляет их снова. – InDaPond
Кажется, что поток wainting в методе run() для входящих пакетов – Javoslaw