1. 程式人生 > >C/C++實現基於UDP的網路程式設計

C/C++實現基於UDP的網路程式設計

         在網路程式設計中,我們一般用UDP或者TCP這兩種協議來進行編寫網路應用程式,那叫UDP呢?

UDP:UDP的簡稱是User Datagram Protocol,中文名是使用者資料報協議,是OSI 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,IETF RFC 768是UDP的正式規範。

具體的網路程式設計基礎大家可以百度跟google,我們現在開始編寫UDP網路應用程式,如果不明白的可以看一下MSDN說明,在win下編寫win32程式必須懂看MSDN,MSDN幫助文件就象我們的老師,裡面有很多關於API詳細說解,還有例項範文讓我們參考。 

1.首先我們編寫一個服務端應用程式程式碼如下:

#include "Winsock2.h"
#include "stdio.h"

int main()
{

////////////////////////////////////////載入套接字////////////////////////////////////////////////////
WORD wVersionRequested;//套接字型檔版本號
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );//定義套接字的版本號

err = WSAStartup( wVersionRequested, &wsaData );//建立套接字
if ( err != 0 ) {
return 0;
}
///建立套接字失敗處理
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) 
{
WSACleanup( );
return 0; 
}

 SOCKET SrvSock = socket(AF_INET, SOCK_DGRAM ,0);//建立套接字
 SOCKADDR_IN SrvAddr;
 SrvAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//繫結服務端IP地址
 SrvAddr.sin_family = AF_INET;//服務端地址族
 SrvAddr.sin_port = htons(6001);//繫結服務端埠號

 bind(SrvSock, (SOCKADDR*)&SrvAddr, sizeof(SOCKADDR));

 int len = sizeof(SOCKADDR);
 char buff[100];
 SOCKADDR ClistAddr;

 recvfrom(SrvSock, buff, 100, 0, (SOCKADDR*)&ClistAddr, &len);//等待接收客戶端的請求到來
 printf("%s\n",buff);//把客戶端傳送來的buff資訊打印出來

 closesocket(SrvSock);//關閉套接字
 WSACleanup();


 system("pause");
 return 0;
}

PS:以上的程式碼因為用到了ws2_32.lib裡面的東西,所以要包含一下ws2_32.lib 

2.接著我們編寫一個客戶端應用程式程式碼如下:

#include "Winsock2.h"
#include "stdio.h"

int main()
{ 

////////////////////////////////////////載入套接字////////////////////////////////////////////////////
WORD wVersionRequested;//套接字型檔版本號
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );//定義套接字的版本號

err = WSAStartup( wVersionRequested, &wsaData );//建立套接字
if ( err != 0 ) {
return 0;
}
///建立套接字失敗處理
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) 
{
WSACleanup( );
return 0; 
}

 SOCKET ClistSock = socket(AF_INET, SOCK_DGRAM, 0);//建立套接字型別

 SOCKADDR_IN SrvAddr;
 SrvAddr.sin_family = AF_INET;//選擇地址族
 SrvAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//服務端的IP地址
 SrvAddr.sin_port = htons(6001);//服務端的埠號

 sendto(ClistSock, "hello",strlen("hello")+1, 0, (SOCKADDR*)&SrvAddr,sizeof(SOCKADDR));//往服務端傳送"hello"訊息
 closesocket(ClistSock);//關閉套接字
 WSACleanup();//

 return 0;
}

 PS:以上的程式碼因為用到了ws2_32.lib裡面的東西,所以要包含一下ws2_32.lib 

服務端總是先啟動,這樣才能等待接收到客戶端傳送的請求,所以我們先啟動服務端,接著啟動客戶端,會看到服務端接收到了來自客戶端傳送的hello資訊!