UDP 為無連線、不可靠但傳輸效率高的協定,適合即時性要求高、容許少量丟包的場景。本文提供完整 Server/Client 通訊範例代碼。
| 角色 | 流程 |
|---|---|
| Server | socket → bind → sendto/recvfrom → closesocket |
| Client | socket → sendto/recvfrom → closesocket |
無需 listen/connect,Server/Client 界限模糊,雙方均可主動收發資料,但不保證可靠性與順序。
void main() {
SOCKET socket1;
InitWinsock();
struct sockaddr_in local, from;
int fromlen = sizeof(from);
local.sin_family = AF_INET;
local.sin_port = htons(1000); // 監聽埠
local.sin_addr.s_addr = INADDR_ANY; // 本機所有介面
socket1 = socket(AF_INET, SOCK_DGRAM, 0);
bind(socket1, (struct sockaddr*)&local, sizeof(local));
while (1) {
char buffer[1024] = "\0";
printf("waiting for message from others-------------\n");
if (recvfrom(socket1, buffer, sizeof(buffer), 0,
(struct sockaddr*)&from, &fromlen) != SOCKET_ERROR) {
printf("Received datagram from %s--%s\n",
inet_ntoa(from.sin_addr), buffer);
// 回送資料給 Client
sendto(socket1, buffer, sizeof(buffer), 0,
(struct sockaddr*)&from, fromlen);
}
Sleep(500);
}
closesocket(socket1);
}
void main() {
SOCKET socket1;
InitWinsock();
struct sockaddr_in server;
int len = sizeof(server);
server.sin_family = AF_INET;
server.sin_port = htons(1000); // Server 埠
server.sin_addr.s_addr = inet_addr("168.168.0.10"); // Server IP
socket1 = socket(AF_INET, SOCK_DGRAM, 0);
while (1) {
char buffer[1024] = "\0";
printf("input message\n");
scanf("%s", buffer);
if (strcmp(buffer, "bye") == 0) break;
if (sendto(socket1, buffer, sizeof(buffer), 0,
(struct sockaddr*)&server, len) != SOCKET_ERROR) {
if (recvfrom(socket1, buffer, sizeof(buffer), 0,
(struct sockaddr*)&server, &len) != SOCKET_ERROR)
printf("rece from server:%s\n", buffer);
}
}
closesocket(socket1);
}
sendto:指定目標位址發送資料報recvfrom:接收資料報並取得來源位址SOCK_DGRAM:資料報 Socket 類型(UDP)UDP 程式設計比 TCP 簡潔許多,在不要求絕對可靠傳輸的場合極具價值。完整專案請參考配套源碼。