首先介紹UDP套接字服務端和客戶端的工做模式,如圖所示: 編程
//recvfrom()函數聲明以下 int recvfrom ( SOCKET s, //套接字 char FAR * buf, //接收數據緩衝區 int len, //接收數據緩衝區大小 int flags, //該參數影響recvfrom()函數的行爲 struct sockaddr FAR* from, //返回發送數據主機地址 int FAR * fromlen //地址長度 ); //調用成功返回接收數據字節數,失敗則返回SOCKET_ERROR //sendto()函數聲明以下 int sendto( SOCKET s, const char FAR * buf, int len, int flags, //該參數影響sendto()函數的行爲 const struct sockaddr FAR * to, //接收數據地址 int tolen //接收數據地址長度 ); //調用成功返回接收數據字節數,失敗則返回SOCKET_ERROR //flags:該參數可爲:0表示函數無特殊行爲; // MSG_DONTROUTE要求傳輸層不要將數據路由出去; // MSG_OOB預示該數據應該被帶外發送
Server Code: 服務器
// server.cpp : 定義控制檯應用程序的入口點。 // #include "stdafx.h" #define BUF_SZIE 64 #include "winsock2.h" #pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]) { WSADATA wsd; //WSADATA變量 SOCKET s; //套接字 SOCKADDR_IN servAddr; //服務器地址 char buf[BUF_SZIE]; //接收數據緩衝區 //初始化套結字動態庫 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { printf("初始化套接字動態庫失敗!\n"); return 1; } //建立套接字 s = socket(AF_INET, SOCK_DGRAM, 0); if (s == INVALID_SOCKET) { printf("建立套接字失敗,失敗緣由; %d\n", WSAGetLastError()); WSACleanup();//釋放套接字資源 return 1; } //服務器地址 servAddr.sin_family = AF_INET; servAddr.sin_port = htons((short)2012); //端口 servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //IP //綁定 if (bind(s, (SOCKADDR *)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) { printf("綁定失敗,失敗緣由: %d\n", WSAGetLastError()); closesocket(s); //關閉套接字 WSACleanup(); //釋放套接字資源 return 1; } //接收數據 SOCKADDR_IN clientAddr; int nClientLen = sizeof(clientAddr); ZeroMemory(buf, BUF_SZIE); if(recvfrom(s, buf, BUF_SZIE, 0, (SOCKADDR*)&clientAddr, &nClientLen) == SOCKET_ERROR) { printf("接收數據失敗,失敗緣由: %d\n", WSAGetLastError()); closesocket(s); //關閉套接字 WSACleanup(); //釋放套接字資源 return 1; } printf("%s\n", buf);//輸出 closesocket(s); //關閉套接字 WSACleanup(); //釋放套接字資源 return 0; }Client Code:
// Client.cpp : 定義控制檯應用程序的入口點。 // #include "stdafx.h" #define BUF_SZIE 64 #include "winsock2.h" #pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]) { WSADATA wsd; //WSADATA變量 SOCKET s; //套接字 SOCKADDR_IN servAddr; //服務器地址 char buf[BUF_SZIE]; //發送數據緩衝區 //初始化套結字動態庫 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { printf("初始化套接字動態庫失敗!\n"); return 1; } //建立套接字 s = socket(AF_INET, SOCK_DGRAM, 0); if (s == INVALID_SOCKET) { printf("建立套接字失敗,錯誤代碼; %d\n", WSAGetLastError()); WSACleanup();//釋放套接字資源 return 1; } //賦值「2012年12月17日」 ZeroMemory(buf, BUF_SZIE); strcpy(buf, "2012年12月17日"); //服務器地址 servAddr.sin_family =AF_INET; servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); servAddr.sin_port = htons((short)2012); int nServAddlen = sizeof(servAddr); //發送數據 if(sendto(s, buf, BUF_SZIE, 0, (SOCKADDR*)&servAddr, nServAddlen) == SOCKET_ERROR) { printf("發送數據失敗,錯誤代碼: %d\n", WSAGetLastError()); closesocket(s); //關閉套接字 WSACleanup(); //釋放套接字資源 return 1; } closesocket(s); //關閉套接字 WSACleanup(); //釋放套接字資源 return 0; }
程序運行結果: 網絡
UDP相對於TCP簡單一些,欲瞭解更加詳細內容請查閱百度,爲了更好地理解兩者的區別與聯繫請對照第一篇TCP程序示例。 socket
轉載請註明出處,謝謝!
原文地址:http://http://www.foregoer.com 函數