Как положить обратно пакет udp в приемный буфер - PullRequest
0 голосов
/ 09 декабря 2011

Я пишу небольшое приложение, которое включает UDP Hole-Punching для P2P-Communication, реализованный в Linux (Posix Sockets).Пока это работает хорошо, но у меня есть проблема с входящими пакетами.

После того, как два клиента получили информацию от соответствующего клиента, они начинают отправлять UDP-пакеты, чтобы сделать дыры в своем брандмауэре.

И тут появляется моя проблема: после отправки «HolePunching-Packet» клиент прослушивает (rcv) входящие пакеты.Если клиент получает «HolePunching-Packet», процесс перфорирования успешно останавливается, и пользователь может начать прием / отправку пользовательских данных.

Но если HolePunching-пакет другого клиента удерживается межсетевым экраном клиентов, этот пакет никогда не достигнет вызова rcv, и текущий поток будет заблокирован, пока следующие пользовательские данные не "разбудят" клиента, но этот перкулярный пакет используется процессом перфорирования и не может быть передан пользователю.

Поэтому я ищу какой-либо способ вернуть первый полученный пакет udp обратно в приемное устройство.-буфер системы.Я не могу использовать свои собственные (char) буферы в качестве противопоказания для проекта и должен найти обходной путь, если нет способа достичь этого с помощью posix-методов.

Ребята, вы знаете какой-нибудь метод, чтобы сделать это вСистемы Posix?

Вот примерная схема работы моего приложения:

SocketClass
{
    Punching
    {
        send(Give me the IP:PORT of Client2)
        recv(Peerinformation)

        send(HolePunchingPacket to client2)
        recv(HolePunchingPacket from client2 or userdata)

        if (recvedPacket != HolePunching-Packet)
           put_back_in_recvbuffer(recvedPacket)

        done
    }

    UserCode
    {
       [...]
    }
}

1 Ответ

2 голосов
/ 09 декабря 2011

Вы можете использовать флаг MSG_PEEK с recv(2) в процессе «перфорирования», а затем удалять данные из очереди только при необходимости, но, честно говоря, это похоже на пометку. Почему бы не реализовать чистый конечный автомат для вашего процесса и пересылать пакеты в соответствующие пути кода в соответствии с состоянием?

...