2016-09-11 2 views
0

Когда я пытаюсь отправить какое-то базовое сообщение UDP, похоже, он его не отправляет. Я попытался запустить несколько примеров, которые я нашел в Интернете. Я использую SocketTest v3.0.0 для тестирования сервера/клиента. Когда я тестировал TCP-отправку, все работало, как ожидалось, но я делаю UDP просто так.Libuv UDP basic send

Можете ли вы предоставить некоторый действительно простой фрагмент кода отправки UDP? Например, приемник будет на локальном хосте, и сообщение будет содержать «тест», и оно будет фиксированной длиной?

И у меня есть еще один маленький вопрос. Я отправляю сообщение на локальный хост, может ли приложение (сервер) сам получить его и подумать, что кто-то еще его отправил (вызвав цикл), потому что он не подключается к определенному узлу, он просто отправляет сообщение и прослушивает один и тот же ip-порт?

Спасибо :)

+0

Вы можете уточнить, что не работает? Какой код вы пробовали? [Этот тест] (https://github.com/libuv/libuv/blob/v1.x/test/test-udp-send-and-recv.c) поможет вам приступить к работе. – saghul

+0

Спасибо, я попробовал пару примеров. При отправке он возвращает '0', поэтому он должен быть отправлен, но сообщение не получено. Я попробую эти тесты. Брандмауэр не должен блокировать сообщения, не так ли? –

+0

uv_udp_send return 0 не означает, что сообщение будет получено, что говорит статус обратного вызова on_recv? Многие корпоративные брандмауэры могут блокировать трафик UDP, попробовали ли вы локальный хост, чтобы быть уверенным? – saghul

ответ

1

У вас есть много полезных примеров здесь: https://nikhilm.github.io/uvbook/networking.html

uv_loop_t *loop; 
uv_udp_t send_socket; 
uv_udp_t recv_socket; 

int main() { 
    loop = uv_default_loop(); 

    uv_udp_init(loop, &recv_socket); 
    struct sockaddr_in recv_addr; 
    uv_ip4_addr("0.0.0.0", 68, &recv_addr); 
    uv_udp_bind(&recv_socket, (const struct sockaddr *)&recv_addr, UV_UDP_REUSEADDR); 
    uv_udp_recv_start(&recv_socket, alloc_buffer, on_read); 

    uv_udp_init(loop, &send_socket); 
    struct sockaddr_in broadcast_addr; 
    uv_ip4_addr("0.0.0.0", 0, &broadcast_addr); 
    uv_udp_bind(&send_socket, (const struct sockaddr *)&broadcast_addr, 0); 
    uv_udp_set_broadcast(&send_socket, 1); 

    uv_udp_send_t send_req; 
    uv_buf_t discover_msg = make_discover_msg(); 

    struct sockaddr_in send_addr; 
    uv_ip4_addr("255.255.255.255", 67, &send_addr); 
    uv_udp_send(&send_req, &send_socket, &discover_msg, 1, (const struct sockaddr *)&send_addr, on_send); 

    return uv_run(loop, UV_RUN_DEFAULT); 
}