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。- // UDPServer.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <WinSock2.h>
- #include <stdio.h>
- #include <stdlib.h>
-
#define DEFAULT_PORT 5150
- #define DEFAULT_COUNT 5
- #define DEFAULT_BUFFER_LENGTH 4096
- int iPort = DEFAULT_PORT;
- DWORD dwCount = DEFAULT_COUNT;
- DWORD dwLength = DEFAULT_BUFFER_LENGTH;
- BOOL bInterface = FALSE;
- char szIterface[32];
- //Print usage information and exit
- void usage()
- {
- printf("usage:sender[-p:int][-i:IP][-n:x][-b:x]\n\n");
- printf(" -p:int Local port\n");
- printf(" -i:IP Local IP address to listen on\n");
- printf(" -n:x Number of times to send message\n");
- printf(" -b:x Size of buffer to send \n\n");
- ExitProcess(1);
- }
- //ValidateArgs
- void ValidateArgs(int argc, _TCHAR** argv)
- {
- for (int i = 1; i < argc; i++)
- {
- if ((argv[i][0] == _T('-') || (argv[i][0] == _T('/'))))
- {
- switch (tolower(argv[i][1]))
- {
- case _T('p'):
- if (_tcslen(argv[i]) > 3)
- {
- iPort = _ttoi(&argv[i][3]);
- }
- break;
- case _T('n'):
- //Number of times to receive message
- if (_tcslen(argv[i]) > 3)
- {
- dwCount = _ttol(&argv[i][3]);
- }
- break;
- case _T('b'):
- //Buffer size
- if (_tcslen(argv[i]) > 3)
- {
- dwLength = _ttol(&argv[i][3]);
- }
- break;
- case _T('i'):
- //Interface to receive datagrams on
- if (_tcslen(argv[i]) > 3)
- {
- bInterface = TRUE;
- _tcscpy_s(szIterface, &argv[i][3]);
- }
- break;
- default:
- usage();
- break;
- }
- }
- }
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- //Parse arguments and load winsock
- ValidateArgs(argc, argv);
- WSADATA wsd;
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
- {
- printf("WSAStartup failed!\n");
- return 1;
- }
- //Create the socket, and bind it to a local interface and port
- SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
- if (s == INVALID_SOCKET)
- {
- printf("socket() failed:%d\n", WSAGetLastError());
- return 1;
- }
- SOCKADDR_IN local;
- local.sin_family = AF_INET;
- local.sin_port = htons((short)iPort);
- if (bInterface)
- {
- local.sin_addr.s_addr = inet_addr(szIterface);
- }
- else
- {
- local.sin_addr.s_addr = htonl(INADDR_ANY);
- }
- if (bind(s, (SOCKADDR*)&local, sizeof(local)) == SOCKET_ERROR)
- {
- printf("bind() failed:%d\n", WSAGetLastError());
- return 1;
- }
- //Allocate the receive buffer
- char* recvbuf = (char*)GlobalAlloc(GMEM_FIXED, dwLength);
- if (!recvbuf)
- {
- printf("GlobalAlloc() failed:%d\n", GetLastError());
- return 1;
- }
- //Read the datagrams
- SOCKADDR_IN sender;
- for (int i = 0; i < (int)dwCount; i++)
- {
- int nSenderSize = sizeof(sender);
- int ret = recvfrom(s, recvbuf, dwLength, 0,
- (SOCKADDR*)&sender, &nSenderSize);
- if (ret == SOCKET_ERROR)
-
相關推薦
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應用(五) 基於UDP的Socket通訊之客戶端
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—socket—udp詳細通訊過程
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連線使用的是“請求—響應方式