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那兩個有點不同,其宣告如下:
注意,這兩個函式裡邊有一個sockaddr結構地址,它是用來儲存該資料傳送者的資訊的。上篇提過,TCP是面向連線的,它在通訊之前需要進行三次握手來確定雙方是否已經準備好了。因此,雙方很清楚資料是從哪裡來的。而UDP是面向資料包的,因此就好像寄快遞一樣,你必須在快遞上寫一張紙條,上面填好姓名,地址等資訊,填好之後,接收者才知道該東西是由誰寄過來的。因此,上面兩個函式提供了sockaddr結構的地址,用於儲存從哪裡發來的和傳送到哪裡的地址資訊。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結構大小地址 );
以下是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