1.6 网络编程之 UDP通信
生活随笔
收集整理的這篇文章主要介紹了
1.6 网络编程之 UDP通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
**************************************************
* 本文由小鳥飛飛整理發表 <samboy@sohu.com> *
* 首發網站:藍麗網 *
* 其他網站轉載請保留以上信息,謝謝! *
**************************************************
又是出差,一個半月啊,煩死了。好在終于回來了。要過年了,先在這里給大家拜個早年吧,祝大家新年快樂。
有一些朋友給我發短信問一 些Socket方面的問題,因為一直出差沒時間回復在這里說聲報謙,先給大家發一節網絡編程的內容吧,希望對朋友們有所幫助。
網絡編 程的主要內容是網絡協議,如TCP、UDP、SMTP、POP3等,要想做好網絡編程首先要了解這些協議。網絡通信主要有兩種方式:同步和異步。網絡程序 主要有兩種程序:發送端和接收端。這里只給大家介紹一下網絡編程的基本思路,希望能起到拋磚引玉的作用。
一、UDP通信
UDP通信屬于一種異步通信,發送端的程序發出信息后不論接收端是否收到都將繼續執行下面的程序。
1、初始化DLL:Windows Socket編程用到SocketDLL庫,所以在使用之前必須先進行初始化工作。Socket DLL也分為不同的幾個版本,需要指定使用的DLL庫的版本。
WSADATA wsaData;
WSAStartup(MAKEWORD(1,1), &wsaData); // 第一個參數就是Socket版本號
2、生成Socket:Socket首先要指定所使用的地址協議,通信協議,UDP通信程序必須指定為SOCK_DGRAM。
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
// Protocol to be used with the socket that is specific to the indicated address family.
//這是MSDN中對第三個參數的說明,不知道怎么解釋了。
3、Bind:這是最重要的一 步,需要將生成的Socket與IP地址和端口號建立對應關系。
SOCKADDR_IN sockSrc;
sockSrc.sin_family = AF_INET;
sockSrc.sin_port = htons(3000);
sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR));
說明:1) bind函數需要指定IP地址和端口號,IP地址必須是執行這個程序所在的計算機的IP地址,將其設定為INADDR_ANY,系統會自動將計算機的IP 地址填入。端口號是用以區別數據是發給哪個網絡程序的,端口號是一個兩個字節的整數,應把它設在1024到5000之間的值,若設為0,則由系統自動分配 一個適當的數值。
2)由于各種計算機的數據讀取方式不同(如PC與UNIX系統),所以在指定端口和IP地址時,要把它們從主機次序轉換到網 絡次序。Htons, Htonl函數實現這種功能。
4、發送/接收數據:
SOCKADDR_IN sockDest;
sockDest.sin_family = AF_INET;
sockDest.sin_port = htons(3001);
sockDest.sin_addr.S_un.S_addr = inet_addr("192.168.0.36");
char buf[1024];
strcpy(buf, "Hello Internet!");
sendto(s, buf, strlen(buf)+1, 0, (SOCKADDR*)&sockDest, sizeof(SOCKADDR));
SOCKADDR_IN sockFrom;
char buf[1024];
memset(buf, 0, 1024);
int len = sizeof(SOCKADDR);
int x=recvfrom(s, buf, 1024, 0, (SOCKADDR*)&sockFrom, &len);
說明:inet_addr用于將固定格式的字符串(形如 “192.168.0.36”)轉換為一個整數,對應的有inet_ntoa用于將整數轉換為“192.168.0.36”形式的字符串。
5、關閉Socket:closesocket(s);
6、釋放DLL:WSACleanup();
7、頭文 件:winsock2.h、LIB:Ws2_32.lib
SOCKADDR_IN 是輸入Internet地址的結構體,可以參考MSDN的說明。 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
* 本文由小鳥飛飛整理發表 <samboy@sohu.com> *
* 首發網站:藍麗網 *
* 其他網站轉載請保留以上信息,謝謝! *
**************************************************
又是出差,一個半月啊,煩死了。好在終于回來了。要過年了,先在這里給大家拜個早年吧,祝大家新年快樂。
有一些朋友給我發短信問一 些Socket方面的問題,因為一直出差沒時間回復在這里說聲報謙,先給大家發一節網絡編程的內容吧,希望對朋友們有所幫助。
網絡編 程的主要內容是網絡協議,如TCP、UDP、SMTP、POP3等,要想做好網絡編程首先要了解這些協議。網絡通信主要有兩種方式:同步和異步。網絡程序 主要有兩種程序:發送端和接收端。這里只給大家介紹一下網絡編程的基本思路,希望能起到拋磚引玉的作用。
一、UDP通信
UDP通信屬于一種異步通信,發送端的程序發出信息后不論接收端是否收到都將繼續執行下面的程序。
1、初始化DLL:Windows Socket編程用到SocketDLL庫,所以在使用之前必須先進行初始化工作。Socket DLL也分為不同的幾個版本,需要指定使用的DLL庫的版本。
WSADATA wsaData;
WSAStartup(MAKEWORD(1,1), &wsaData); // 第一個參數就是Socket版本號
2、生成Socket:Socket首先要指定所使用的地址協議,通信協議,UDP通信程序必須指定為SOCK_DGRAM。
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
// Protocol to be used with the socket that is specific to the indicated address family.
//這是MSDN中對第三個參數的說明,不知道怎么解釋了。
3、Bind:這是最重要的一 步,需要將生成的Socket與IP地址和端口號建立對應關系。
SOCKADDR_IN sockSrc;
sockSrc.sin_family = AF_INET;
sockSrc.sin_port = htons(3000);
sockSrc.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&sockSrc, sizeof(SOCKADDR));
說明:1) bind函數需要指定IP地址和端口號,IP地址必須是執行這個程序所在的計算機的IP地址,將其設定為INADDR_ANY,系統會自動將計算機的IP 地址填入。端口號是用以區別數據是發給哪個網絡程序的,端口號是一個兩個字節的整數,應把它設在1024到5000之間的值,若設為0,則由系統自動分配 一個適當的數值。
2)由于各種計算機的數據讀取方式不同(如PC與UNIX系統),所以在指定端口和IP地址時,要把它們從主機次序轉換到網 絡次序。Htons, Htonl函數實現這種功能。
4、發送/接收數據:
SOCKADDR_IN sockDest;
sockDest.sin_family = AF_INET;
sockDest.sin_port = htons(3001);
sockDest.sin_addr.S_un.S_addr = inet_addr("192.168.0.36");
char buf[1024];
strcpy(buf, "Hello Internet!");
sendto(s, buf, strlen(buf)+1, 0, (SOCKADDR*)&sockDest, sizeof(SOCKADDR));
SOCKADDR_IN sockFrom;
char buf[1024];
memset(buf, 0, 1024);
int len = sizeof(SOCKADDR);
int x=recvfrom(s, buf, 1024, 0, (SOCKADDR*)&sockFrom, &len);
說明:inet_addr用于將固定格式的字符串(形如 “192.168.0.36”)轉換為一個整數,對應的有inet_ntoa用于將整數轉換為“192.168.0.36”形式的字符串。
5、關閉Socket:closesocket(s);
6、釋放DLL:WSACleanup();
7、頭文 件:winsock2.h、LIB:Ws2_32.lib
SOCKADDR_IN 是輸入Internet地址的結構體,可以參考MSDN的說明。 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的1.6 网络编程之 UDP通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.5 MFC封装思想
- 下一篇: 彻彻底底了解回调函数