1. 程式人生 > >windows Socket程式設計之UDP的服務端和客戶端

windows Socket程式設計之UDP的服務端和客戶端

上一篇講了TCP的服務端和客戶端,本篇文章來介紹一下UDP的服務端和客戶端。

相比TCP來說,UDP相對比較簡單,剛開始的時候,和TCP一樣都需要先進行網路環境的初始化,即呼叫WSAStartup函式。然後呢,我們也需要建立一個socket,這個socket和TCP的那個socket不同,上篇提過TCP建立一個socket呼叫socket函式時,第二個引數為SOCK_STREAM,而UDP則需要給定一個SOCK_DGRAM,然後在第三個引數上給一個IPPROTO_UDP,這樣我們就建立好了一個UDP的socket。

接下來,也和TCP一樣,指定SOCKADDR_IN的地址資訊(埠,ip),指定完之後呢,若是客戶端,則可以直接就進行通訊了,若是服務端,則還需要增加一步bind操作,當我們呼叫bind函式,進行繫結後,服務端就可以和客戶端進行通訊了。而TCP的服務端還有兩個步驟,一個是listen,一個是accept,UDP省略了這兩個步驟。

上篇提到TCP進行資料的收發是通過recv和send兩個API來進行資料的收發的。而UDP也需要兩個函式,叫做recvform和sendto,這兩個和TCP那兩個有點不同,其宣告如下:

int recvfrom(  
  SOCKET s,                     //socket
  char FAR* buf, <span style="white-space:pre">		</span>//接收資料的緩衝區             
  int len,                      //緩衝區的大小
  int flags,                    //標誌位,呼叫操作方式
  struct sockaddr FAR *from,    //sockaddr結構地址
  int FAR *fromlen              //sockaddr結構大小地址
);
int sendto(  
  SOCKET s,                    <span style="white-space:pre">		</span>//socket      
  const char FAR *buf,         <span style="white-space:pre">		</span>//傳送資料的緩衝區   
  int len,                    <span style="white-space:pre">		</span>//緩衝區大小      
  int flags,                       <span style="white-space:pre">	</span>//標誌位,呼叫操作方式
  const struct sockaddr FAR *to,    <span style="white-space:pre">	</span>//sockaddr結構地址
  int tolen                        <span style="white-space:pre">	</span>//sockaddr結構大小地址
);
注意,這兩個函式裡邊有一個sockaddr結構地址,它是用來儲存該資料傳送者的資訊的。上篇提過,TCP是面向連線的,它在通訊之前需要進行三次握手來確定雙方是否已經準備好了。因此,雙方很清楚資料是從哪裡來的。而UDP是面向資料包的,因此就好像寄快遞一樣,你必須在快遞上寫一張紙條,上面填好姓名,地址等資訊,填好之後,接收者才知道該東西是由誰寄過來的。因此,上面兩個函式提供了sockaddr結構的地址,用於儲存從哪裡發來的和傳送到哪裡的地址資訊。

以下是UDP的服務端和客戶端的示例程式碼:

服務端:

#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>

#pragma comment(lib,"ws2_32.lib")
#define  PORT 6000

int main(int argc, char* argv[])
{
	//初始化網路環境
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
	{
		printf("WSAStartup failed\n");
		return -1;
	}

	//建立一個UDP的socket
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (sock == SOCKET_ERROR)
	{
		printf("create socket failed\n");
		return -1;
	}

	//繫結地址資訊
	sockaddr_in serverAddr;
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(PORT);
	serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	bind(sock, (sockaddr*)&serverAddr, sizeof(sockaddr));
	
	char buf[512];
	while (TRUE)
	{
		memset(buf, 0, 512);
		// 網路節點的資訊,用來儲存客戶端的網路資訊
		sockaddr_in clientAddr;
		memset(&clientAddr, 0, sizeof(sockaddr_in));

		int clientAddrLen = sizeof(sockaddr);
		//接收客戶端發來的資料
		int ret = recvfrom(sock, buf, 512, 0,(sockaddr*) &clientAddr,&clientAddrLen );
		
		printf("Recv msg:%s from IP:[%s] Port:[%d]\n", buf,inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port));
		// 發一個數據包返回給客戶
		sendto(sock, "Hello World!", strlen("Hello World!"), 0, (sockaddr*)&clientAddr, clientAddrLen);
		printf("Send msg back to IP:[%s] Port:[%d]\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
	}
	return 0;
}

客戶端:
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>

#pragma comment(lib,"ws2_32.lib")
#define  PORT 6000
int main(int argc, char* argv[])
{
	//初始化網路環境
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
	{
		printf("WSAStartup failed\n");
		return -1;
	}
	//建立一個UDP的socket
	SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (sockClient == INVALID_SOCKET)
	{
		printf("create socket failed\n");
		return -1;
	}
	// 申明一個網路地址資訊的結構體,儲存伺服器的地址資訊
	sockaddr_in addr = { 0 };
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	char buf[] = "client test!";
	//傳送資料
	int dwSent = sendto(sockClient, buf, strlen(buf), 0, (SOCKADDR *)&addr, sizeof(SOCKADDR));
	if (dwSent == 0)
	{
		printf("send %s failed\n", buf);
		return -1;
	}
	printf("send msg:%s\n", buf);

	char recvBuf[512];
	memset(recvBuf, 0, 512);

	sockaddr_in addrSever = { 0 };
	int nServerAddrLen=sizeof(sockaddr_in);
	// 接收資料
	int dwRecv = recvfrom(sockClient, recvBuf, 512, 0, (SOCKADDR *)&addrSever,&nServerAddrLen);
	printf("Recv msg from server : %s\n", recvBuf);
	//關閉SOCKET連線
	closesocket(sockClient);
	//清理網路環境
	WSACleanup();
	system("pause");
	return 0;
}

相關推薦

windows Socket程式設計UDP服務客戶

上一篇講了TCP的服務端和客戶端,本篇文章來介紹一下UDP的服務端和客戶端。 相比TCP來說,UDP相對比較簡單,剛開始的時候,和TCP一樣都需要先進行網路環境的初始化,即呼叫WSAStartup函式。然後呢,我們也需要建立一個socket,這個socket和TCP的那個s

Windows Socket程式設計UDP實現大檔案的傳輸

前言:本文實現以下功能:在客戶端,使用者選擇本地的某個檔案,併發送到伺服器端。在伺服器端,接收客戶端傳輸的資料流,並按IP 地址儲存在伺服器端(文件名重複的,可以覆蓋)。如果傳輸過程中伺服器端發現客戶端斷開,伺服器端應刪除檔案,並在螢幕上提示,如“IP:1.2.3.4 發來a

使用自環接口的UDP服務客戶

while clas code style client cal listen __main__ choices 1 import argparse,socket 2 from datetime import datetime 3 4 MAX_BYTES = 6

C#程式設計 socket程式設計udp伺服器客戶

基於Udp協議是無連線模式通訊,佔用資源少,響應速度快,延時低。至於可靠性,可通過應用層的控制來滿足。(不可靠連線) 使用Udp協議通訊需要具備以下幾個條件: (1).建立一個套接字(Socket) (2).繫結伺服器端IP地址及埠號--伺服器端 (3).通過SendTo()方法向指

socket編程服務客戶

解決 ont 使用 lose 協議 監聽器 class 格式 tcp客戶端 服務端和客戶端就像銀行出納員和客戶樣,一個銀行出納員(服務器),不吃不睡的服務排隊的客戶,每個客戶都會有要解決的問題,一旦完成,客戶就會走開,出納員等待下一個客戶的到來。 服務器端: from s

C#程式設計 socket程式設計tcp伺服器客戶

基於Tcp協議的Socket通訊類似於B/S架構,面向連線,但不同的是伺服器端可以向客戶端主動推送訊息。 使用Tcp協議通訊需要具備以下幾個條件: (1).建立一個套接字(Socket) (2).繫結伺服器端IP地址及埠號--伺服器端 (3).利用Listen()方法開啟監聽--伺服

java socket網路程式設計例項程式碼(含服務客戶

本程式碼為java socket網路程式設計例項程式碼,包括客戶端和服務端,實現客戶端傳送訊息,服務端接收並反饋訊息。 server.java為服務端程式碼。 client.java為客戶端程式碼。 服務端程式碼server.java: package socket;

Socket程式設計服務客戶互相通訊,實現簡單的聊天

客戶端兩個執行緒分別記錄讀和寫,服務端兩個執行緒分別記錄讀和寫; 客戶端程式碼: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import

MFC——socket程式設計(淺出+深度:服務客戶埠問題)

要寫網路程式就必須用Socket,這是程式設計師都知道的。而且,面試的時候,我們也會問對方會不會Socket程式設計?一般來說,很多人都會說,Socket程式設計基本就是listen,accept以及send,write等幾個基本的操作。是的,就跟常見的檔案操作一樣,只要寫過就一定知道。 對於網路程式設計,

Socket系列(二)基於Socket網路通訊的服務客戶程式設計

        Socket系列一主要介紹了Socket的基礎知識、工作原理以及與傳統的http協議的區別。這部分內容的目的是為本文做鋪墊。本文將介紹基於Socket網路通訊的伺服器端和客戶端的程式設計。 一、伺服器端的程式設計         關於Socket伺服器端的

Socket程式設計實現服務客戶的互動

用Socket實現網路程式設計首先要建立一個Socket物件,Socket類位於System.Net.Socket名稱空間,需要先行匯入。建立Socket物件需要以下三個引數,這些引數都是列舉型別: ①AddressFamily成員指定Socket用來解析地址的定址方案,

Java網絡編程【Socket服務客戶

rgs .net aio highlight 如果 org author oid try Socket 編程大家都不陌生,Java 學習中必學的部分,也是 Java網絡編程核心內容之一。Java 網絡編程又包括 TCP、UDP,URL 等模塊。TCP 對應 Socket

python3實現UDP協議的簡單服務客戶

開始 turn lose () rec 交流 cnblogs 無連接 簡單的 利用python中的socket模塊中的來實現UDP協議,這裏寫一個簡單的服務器和客戶端。為了說明網絡編程中UDP的應用,這裏就不寫圖形化了,在兩臺電腦上分別打開UDP的客戶端和服務端就可以了。

QUdpSocket-Qt使用Udp通訊實現服務客戶

array tle sig post 客戶端 種類型 可用 進行 += 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址: 本文標題:QUdpSocket-Qt使用Udp通訊實現服務端和客戶端 本文地址:http://t

windows安裝svn服務客戶遇到的問題

註意 屬性 family 服務 電腦 圖片 地址 本地 pos 在本機既安裝svn服務器,又安裝svn客戶端,中間遇到的問題: 安裝svn-server端,將本地文件導入到svn-server,(要導入服務器的文件-右鍵-import-輸入要導入的路徑).註意:中

Socket(套接字)在服務客戶之間的基本工作原理

SocketSocket之間的連接過程主要可以概括為以下三步: 服務器建立監聽:客戶端初始化Socket動態庫後創建套接字,然後指定客戶端Socket的地址,循環綁定Socket直至成功,然後開始建立監聽,此時客戶端處於等待狀態,實時監控網絡狀態; 客戶端提出請求:客戶端的Socket向服務器端提出

socket創建服務客戶

server col 監聽 print 套接字 127.0.0.1 liunx 類型 socket 看情況選擇相對應的套接字*面向連接的傳輸--tcp協議--可靠的--流式套接字(SOCK_STREAM)*面向無連接的傳輸--udp協議--不可靠的--數據報套接字(SOCK

Socket TCP 協議實現服務客戶的簡單通訊-結合線程池的使用

文章目錄 前言 當前模式的弊端 服務端程式碼 客戶端程式碼 執行結果 客戶端 服務端

從零開始學Socket:(二)連線服務客戶

先了解一下執行緒問題,在Main函式裡就是主執行緒他能處理程式碼,而new Thread就是新開一個執行緒,他和主執行緒互不干預,但是主執行緒完了,他也完了。他完了,主執行緒沒事。   在上篇部落格裡,我們已經建立好了伺服器端和客戶端,但是他們倆還沒有聯絡,要把他們聯絡起來,就

從零開始學Socket:(一)服務客戶建立

上篇我提到Socket是TCP/IP的抽象介面。所以我們直接使用就好,沒必要知其甚解。 1.開啟VS 新建專案 名稱,位置隨意 這裡名稱是Server 框架選.NET 4.5(在這篇部落格裡也無所謂) 注意引用 using System.Net; using