Ці павінен UDP-сокет праходзіць працэс прыняцця, як TCP-сокеты? (Does UDP socket need to go through the Accept Process like TCP sockets?)


問題描述

Ці павінен UDP‑сокет праходзіць працэс прыняцця, як TCP‑сокеты? (Does UDP socket need to go through the Accept Process like TCP sockets?)

I'm working with UDP and i was wondering about the Accept Method when multiple machine need to connect to a server. So far i was working with UDPCliente class, IPEndPoint class and BeginRecieve / EndRecieve Method to create a server where multiple machine can connect at the same time.

My question is simple do i need to use Accept Method to handler incoming connection and create a new socket for each new connection ?

What is the best way to handler multiple connection with UDP ?

The code samples i've seen so far create a new UDPClient class and a IPEndPoint where the server is listening for connections after that, the code call the BeginRecieve passing a function where the data is recieved and then starts the process of BeginRecieve again.

These are the code samples i've been using so far:

public static void receiveCallback(IAsyncResult ar)
{
    UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
    IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;

    byte[] receiveBytes = u.EndReceive(ar, ref e);
    UdpState s = new UdpState();
    s.e = e;
    s.u = u;
    u.BeginReceive(new AsyncCallback(receiveCallback), s);
}

public static void receiveMessages()
{
    IPEndPoint e = new IPEndPoint(IPAddress.Any, 5050);
    UdpClient u = new UdpClient(e);
    UdpState s = new UdpState();

    s.e = e;
    s.u = u;
    u.BeginReceive(new AsyncCallback(receiveCallback), s);
}

‑‑‑‑‑

參考解法

方法 1:

UDP is connectionless, so there's nothing to accept. If you need connections over UDP, then you have to implement them. Ideally, you would assign each "connection" some kind of identifier and include it in each datagram sent to the server. In some cases, it may be sufficient just to rely on the IP address and port to identify "connections".

But you can do it however you want. UDP treats each datagram as independent.

方法 2:

Short answer ‑ no, you don't use accept() with UDP.

In UDP there are no connections, only datagrams. One side sends them and the other might receive them. Each datagram has information about the sender (IP address and port) that your server app can extract to differentiate the clients.

(by JoskerDavid SchwartzNikolai Fetissov)

參考文件

  1. Does UDP socket need to go through the Accept Process like TCP sockets? (CC BY‑SA 3.0/4.0)

#sockets #beginreceive #UDP #C#






相關問題

Ці павінен UDP-сокет праходзіць працэс прыняцця, як TCP-сокеты? (Does UDP socket need to go through the Accept Process like TCP sockets?)

як запусціць каманду openssl з прыкладання java (how to run openssl command from a java application)

TypeError: непадтрымоўваны сокет тыпу аперанда Python (TypeError: unsupported operand type-python socket)

套接字編程:某些 ISP 是否對 FTP 上傳施加了速率限制? (Socket programming: Do some ISP's impose rate-limiting on FTP uploads?)

兩個進程使用同一個端口? (Two processes using the same port?)

Akka TCP 客戶端:如何使用 akka actor 通過 TCP 發送消息 (Akka TCP client: How can I send a message over TCP using akka actor)

無法運行 python-bluez RFCOMM 服務器示例腳本 (Cannot run python-bluez RFCOMM server example script)

Java中的套接字和進程 (Sockets and Processes in Java)

在網絡環境中從 Brother TD-4100N 打印機檢索打印機狀態 (Retrieving the printer status from the Brother TD-4100N printer in a network environment)

通過套接字連接發送 GUI/TUI (Sending a GUI/TUI Over a Socket Connection)

如果服務器無法訪問,則在 android 上運行的客戶端將關閉並退出應用程序,無異常或函數“connect (socket)”中的任何消息 (the client running on android closes and exit application without exception or any message in function “connect (socket)” if the server is unreachable)

使用 C 的 select() 系統調用為 UDP 應用程序創建多個客戶端和一個服務器 (Creating Multiple Client and One Server for UDP application using select() system call with C)







留言討論