1. 程式人生 > >Win32 UDP Socket通訊學習

Win32 UDP Socket通訊學習

學習內容,參見《Windows網路程式設計》第7章 Winsock基礎

與TCP流式協議不同,UDP為資料報協議。

服務端接受資料,客戶端傳送資料。

UDP服務端流程

  • Socket或WSASocket建立套接字,用SOCK_DGRAM標誌。
  • bind繫結到IP地址和埠。
  • recvfrom/WSARecvFrom接受資料。

UDP客戶端流程

UDP客戶端有兩種方式,一種為無連線,一種為建立虛擬連線。

方式一 無連線

  • Socket或WSASocket建立套接字,用SOCK_DGRAM標誌。
  • 設定伺服器地址和埠。
  • sento/WSASendTo傳送資料。

方式二 建立虛擬連線

  • Socket或WSASocket建立套接字,用SOCK_DGRAM標誌。
  • 設定伺服器地址和埠。
  • connect連線服務端。
  • 呼叫send傳送資料。

使用windows的Winsock 2程式設計,需要進行工程配置。

  • 工程右鍵Properties->ConfigurationProperties->Linker->Input->Additional Dependencies中新增ws2_32.lib。
  • Demo程式碼採用Multi-Byte方式,設定Properties->ConfigurationProperties->General->Character Set為Use Multi-Byte Character Set。

備註:所有關係到收發資料的緩衝都屬於簡單的char型別,這些函式沒有Unicode版本。當字符集為Unicode時,需要進行字串轉換。

服務端原始碼,UDPServer.cpp。
  1. // UDPServer.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <WinSock2.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #define DEFAULT_PORT 5150
  8. #define DEFAULT_COUNT 5
  9. #define DEFAULT_BUFFER_LENGTH 4096
  10. int iPort = DEFAULT_PORT;  
  11. DWORD dwCount = DEFAULT_COUNT;  
  12. DWORD dwLength = DEFAULT_BUFFER_LENGTH;  
  13. BOOL bInterface = FALSE;  
  14. char szIterface[32];  
  15. //Print usage information and exit
  16. void usage()  
  17. {  
  18.     printf("usage:sender[-p:int][-i:IP][-n:x][-b:x]\n\n");  
  19.     printf("      -p:int  Local port\n");  
  20.     printf("      -i:IP    Local IP address to listen on\n");  
  21.     printf("      -n:x    Number of times to send message\n");  
  22.     printf("      -b:x    Size of buffer to send \n\n");  
  23.     ExitProcess(1);  
  24. }  
  25. //ValidateArgs
  26. void ValidateArgs(int argc, _TCHAR** argv)  
  27. {  
  28.     for (int i = 1; i < argc; i++)  
  29.     {  
  30.         if ((argv[i][0] == _T('-') || (argv[i][0] == _T('/'))))  
  31.         {  
  32.             switch (tolower(argv[i][1]))  
  33.             {  
  34.             case _T('p'):  
  35.                 if (_tcslen(argv[i]) > 3)  
  36.                 {  
  37.                     iPort = _ttoi(&argv[i][3]);  
  38.                 }  
  39.                 break;  
  40.             case _T('n'):  
  41.                 //Number of times to receive message
  42.                 if (_tcslen(argv[i]) > 3)  
  43.                 {  
  44.                     dwCount = _ttol(&argv[i][3]);  
  45.                 }  
  46.                 break;  
  47.             case _T('b'):  
  48.                 //Buffer size
  49.                 if (_tcslen(argv[i]) > 3)  
  50.                 {  
  51.                     dwLength = _ttol(&argv[i][3]);  
  52.                 }  
  53.                 break;  
  54.             case _T('i'):  
  55.                 //Interface to receive datagrams on
  56.                 if (_tcslen(argv[i]) > 3)  
  57.                 {  
  58.                     bInterface = TRUE;  
  59.                     _tcscpy_s(szIterface, &argv[i][3]);  
  60.                 }  
  61.                 break;  
  62.             default:  
  63.                 usage();  
  64.                 break;  
  65.             }  
  66.         }  
  67.     }  
  68. }  
  69. int _tmain(int argc, _TCHAR* argv[])  
  70. {  
  71.     //Parse arguments and load winsock
  72.     ValidateArgs(argc, argv);  
  73.     WSADATA wsd;  
  74.     if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)  
  75.     {  
  76.         printf("WSAStartup failed!\n");  
  77.         return 1;  
  78.     }  
  79.     //Create the socket, and bind it to a local interface and port
  80.     SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);  
  81.     if (s == INVALID_SOCKET)  
  82.     {  
  83.         printf("socket() failed:%d\n", WSAGetLastError());  
  84.         return 1;  
  85.     }  
  86.     SOCKADDR_IN local;  
  87.     local.sin_family = AF_INET;  
  88.     local.sin_port = htons((short)iPort);  
  89.     if (bInterface)  
  90.     {  
  91.         local.sin_addr.s_addr = inet_addr(szIterface);  
  92.     }  
  93.     else
  94.     {  
  95.         local.sin_addr.s_addr = htonl(INADDR_ANY);  
  96.     }  
  97.     if (bind(s, (SOCKADDR*)&local, sizeof(local)) == SOCKET_ERROR)  
  98.     {  
  99.         printf("bind() failed:%d\n", WSAGetLastError());  
  100.         return 1;  
  101.     }  
  102.     //Allocate the receive buffer
  103.     char* recvbuf = (char*)GlobalAlloc(GMEM_FIXED, dwLength);  
  104.     if (!recvbuf)  
  105.     {  
  106.         printf("GlobalAlloc() failed:%d\n", GetLastError());  
  107.         return 1;  
  108.     }  
  109.     //Read the datagrams
  110.     SOCKADDR_IN sender;  
  111.     for (int i = 0; i < (int)dwCount; i++)  
  112.     {  
  113.         int nSenderSize = sizeof(sender);  
  114.         int ret = recvfrom(s, recvbuf, dwLength, 0,  
  115.             (SOCKADDR*)&sender, &nSenderSize);  
  116.         if (ret == SOCKET_ERROR)  
  117. 相關推薦

    Win32 UDP Socket通訊學習

    學習內容,參見《Windows網路程式設計》第7章 Winsock基礎 與TCP流式協議不同,UDP為資料報協議。 服務端接受資料,客戶端傳送資料。 UDP服務端流程 Socket或WSASocket建立套接字,用SOCK_DG

    android 通訊學習之路 socket udp tcp

    原文 https://www.jianshu.com/p/61de9478c9aa   整體步驟流程 先來說一下整體的步驟思路吧: 傳送 UDP 廣播,大家都知道 UDP 廣播的特性是整個網段的裝置都可以收到這個訊息。 接收方收到了 UDP 的廣播,將

    C#Socket通訊基礎(非同步Socket通訊UDP

    一、通訊原理參考https://blog.csdn.net/xiaochenXIHUA/article/details/83446031。 非同步通訊解決同步通訊的缺點可以雙向傳送和接收資訊;非同步通訊思路是引入多執行緒機制,在一個程序中使用兩個執行緒,分別處理接收執行緒與傳送執行緒,這種機制稱

    C#Socket通訊基礎(同步Socket通訊UDP

    一、UDP通訊原理 UDP協議使用無連線的套接字,因此不需要再網路裝置之間傳送連線資訊,但是必須用Bind方法繫結到一個本地地址/埠上。 ①建立套接字 ②繫結IP地址和埠作為伺服器端 ③直接使用SendTo/ReceiveFrom來執行操作 注意:同步Socket(UDP)通訊存

    三、UDP實現簡單的socket通訊例項

    1.伺服器端程式碼 package udp; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * 類功能描述:伺服器端,先啟動伺服器端後啟動

    Android學習——藍芽Socket通訊

    藍芽Socket通訊 UUID 在藍芽中,每個服務和服務屬性都唯一地由 全域性唯一識別符號 ,Universally Unique Identifier(UUID)來校驗。正如它的名字所暗示的,每一個這樣的識別符號都要在時空上保證唯一。UUID類可表現為短整形(16或32位)和長

    Java學習筆記之--------網路程式設計之Socket通訊----聊天室實現

    Socket通訊 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。基於TCP/IP協議,建立穩定的點對點的通訊。 特點:實時、快速、安全性高、佔用系統資源多、效率低。 通常也稱作"套接字",套接字是一種程序間的資料交換機制。這些程序既可以在同一機

    java網路通訊Socket通訊:TCP/UDP

    網路通訊三要素:協議,IP,埠。七層協議。 package com.qianfeng.test; /* * 網路程式設計基礎: * 網路的通訊:三要素:協議,IP,埠 * 1.IP:在網路上唯一的標記一臺主機 127.0.0.1 :保留地址/本地地址 java

    PKI學習之路(一)------------------------java實現簡單的socket通訊

    專案地址:https://github.com/gongxianshengjiadexiaohuihui/PKI 關於什麼是socket通訊,我會寫一篇部落格去敘述 這次我們主要實現client和server通過socket進行通訊 server程式碼 package com.ggp

    c++ udp socket學習

    ////////////////////////////////////////////////////////////////////////// // UDPServer.cpp #include <stdio.h> #include <WINSOCK2.H&

    基於udp協議的Socket通訊案例

    傳送端程式碼 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.ne

    Socket通訊簡易學習

    Socket開啟通訊通道,告訴本地機器,願意在該通道上接受客戶請求——監聽,等待客戶請求——接受請求,建立專用連結進行讀寫——處理完畢,關閉專用連結——關閉通訊通道(當然其中監聽到關閉專用連結可以重複迴圈) Ø  客戶端:開啟通訊通道,連線伺服器——資料互動——關閉通道。 服務端server程式

    Java Socket應用(五) 基於UDPSocket通訊之客戶端

    UDPClient.java package com.yijia; import java.io.IOException; import java.net.*; /** * 建立時間:2018/10/4 15:44 * 作者: * 郵箱:[email p

    python筆記 3-4網路通訊服務 linux上服務搭建 vim udp socket

    day3 網路通訊服務 linux上服務搭建 linux基本操作 FTP服務 FTP 檔案傳輸協議 服務端安裝vsftpd 命令:sudo apt-get install vsftpd ssh服務 SSH 安全協議,常用於遠端登入 服務端:sudo apt-get insta

    vs—socketudp詳細通訊過程

    socket和tcp/ip協議的關係 Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓So

    關於socket通訊學習

    1啟動seversocket服務等待客戶端傳送請求,或者說是發起輸出流outputStream,然後通過inputStream獲取流中的資料,在學習socket通訊的時候首先應該先掌握java中的IO這是比較重點的(不知道我這樣描述對不對)。 ps: IO流操作一般分為兩類:字元流和位元組流

    Linux socket通訊(UDP)

    udp服務端 #include<stdio.h> #include <sys/socket.h> #include<string.h> #include <arpa/inet.h> #include <unistd.h> #includ

    26 API-網路程式設計(網路概述,Socket通訊機制,UDP協議傳送和接收資料,TCP協議傳送和接收資料)

    1:網路程式設計(理解) (1)網路程式設計:用Java語言實現計算機間資料的資訊傳遞和資源共享(2)網路程式設計模型 l網路模型一般是指 OSI(Open System Interconnection開放系統互連)參考模型 TCP/IP參考模型 (3)網路程式

    SOCKET通訊中TCP、UDP資料包大小的確定

    TCP、UDP資料包大小的確定 UDP和TCP協議利用埠號實現多項應用同時傳送和接收資料。資料通過源埠傳送出去,通過目標埠接收。有的網路應用只能使用預留或註冊的靜態埠;而另外一些網路應用則可以使用未被註冊的動態埠。因為UDP和TCP報頭使用兩個位元組存放埠號,所以埠號的有效範圍是從0到6

    Socket 通訊原理(Android客戶端和伺服器以TCP&&UDP方式互通)

    ZERO、前言 有關通訊原理內容是在網上或百科整理得到,程式碼部分為本人所寫,如果不當,還望指教。 一、Socket通訊簡介  Android與伺服器的通訊方式主要有兩種,一是Http通訊,一是Socket通訊。兩者的最大差異在於,http連線使用的是“請求—響應方式