C++使用UDP通訊的實(shí)現(xiàn)示例
對C++使用UDP做了簡單封裝,可直接運(yùn)行
頭文件udp.h
#pragma once #include <Winsock.h> #pragma comment(lib,"WS2_32.lib") #define LOCAL_IP_ADDR INADDR_ANY //當(dāng)前應(yīng)用程序接收的IP地址 #define LOCAL_PORT 9527 //當(dāng)前應(yīng)用程序的端口 #define DEST_IP_ADDR "127.0.0.1" //目標(biāo)應(yīng)用程序的IP地址 #define DEST_PORT 9526 //目標(biāo)應(yīng)用程序的端口 class UDP { public: UDP(); ~UDP(); void setLocalSockAddr(unsigned long localAddr, const int localPort); //設(shè)置當(dāng)前應(yīng)用程序的IP地址和端口 void setDestSockAddr(const char* destAddr, const int destPort); //設(shè)置目標(biāo)應(yīng)用程序的IP地址和端口 int sendData(char* buf, int len); int recvData(char* buf, int len); private: WSADATA m_wsaData; SOCKET m_Socket; sockaddr_in m_localSockAddr; //當(dāng)前應(yīng)用程序的sockaddr_in結(jié)構(gòu)體 sockaddr_in m_destSockAddr; //目標(biāo)應(yīng)用程序的sockaddr_in結(jié)構(gòu)體 };
源文件udp.cpp
#include "udp.h" UDP::UDP() { WSAStartup(MAKEWORD(2, 2), &m_wsaData); m_Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //將socket設(shè)為非阻塞模式 u_long mode = 1; ioctlsocket(m_Socket, FIONBIO, &mode); //設(shè)置當(dāng)前程序和目標(biāo)程序的配置 setLocalSockAddr(LOCAL_IP_ADDR, LOCAL_PORT); setDestSockAddr(DEST_IP_ADDR, DEST_PORT); } UDP::~UDP() { closesocket(m_Socket); WSACleanup(); } //設(shè)置當(dāng)前應(yīng)用程序的IP地址和端口 void UDP::setLocalSockAddr(unsigned long localAddr, const int localPort) { //當(dāng)前應(yīng)用程序的配置 m_localSockAddr.sin_family = AF_INET; m_localSockAddr.sin_addr.s_addr = htonl(localAddr); m_localSockAddr.sin_port = htons(localPort); //綁定當(dāng)前應(yīng)用程序套接字 bind(m_Socket, (SOCKADDR*)&m_localSockAddr, sizeof(m_localSockAddr)); } //設(shè)置目標(biāo)應(yīng)用程序的IP地址和端口 void UDP::setDestSockAddr(const char * destAddr, const int destPort) { //目標(biāo)應(yīng)用程序的配置 m_destSockAddr.sin_family = AF_INET; m_destSockAddr.sin_addr.s_addr = inet_addr(destAddr); m_destSockAddr.sin_port = htons(destPort); } int UDP::sendData(char * buf, int len) { int ret = sendto(m_Socket, buf, len, 0, (SOCKADDR*)&m_destSockAddr, sizeof(m_destSockAddr)); return ret; } int UDP::recvData(char* buf, int len) { int sockAddrSize = sizeof(sockaddr_in); int ret = recvfrom(m_Socket, buf, len, 0, (SOCKADDR*)&m_localSockAddr, &sockAddrSize); return ret; }
使用示例
程序1
#include <iostream> #include "udp.h" int main() { UDP udp; while (1) { char buf[1024]; int ret = udp.recvData(buf, 1024); if (ret > 0) { std::cout << "server recv: " << buf << std::endl; } else { std::cout << "server recv: " << "recv failed" << std::endl; } Sleep(1000); } return 0; }
程序2
需要先將udp.h中宏定義的IP和端口修改一下
#define LOCAL_IP_ADDR INADDR_ANY //當(dāng)前應(yīng)用程序接收的IP地址 #define LOCAL_PORT 9527 //當(dāng)前應(yīng)用程序的端口 #define DEST_IP_ADDR "127.0.0.1" //目標(biāo)應(yīng)用程序的IP地址 #define DEST_PORT 9526 //目標(biāo)應(yīng)用程序的端口
#include <iostream> #include "udp.h" int main() { UDP udp; while (1) { char buf[1024] = "hello udp..."; udp.sendData(buf, 1024); std::cout << "client send: " << buf << std::endl; Sleep(1000); } return 0; }
程序運(yùn)行效果
將兩個(gè)程序一起打開,可以看到運(yùn)行結(jié)果
到此這篇關(guān)于C++使用UDP通訊的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C++ UDP通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中的結(jié)構(gòu)體的入門學(xué)習(xí)教程
這篇文章主要介紹了C語言中的結(jié)構(gòu)體的入門學(xué)習(xí)教程,以struct語句定義的結(jié)構(gòu)體是C語言編程中的重要基礎(chǔ),需要的朋友可以參考下2015-12-12C++&&Opencv實(shí)現(xiàn)控制臺字符動畫的方法
這篇文章主要介紹了C++&&Opencv實(shí)現(xiàn)控制臺字符動畫的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了如何使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06簡要對比C語言中的truncate()函數(shù)與ftruncate()函數(shù)
這篇文章主要介紹了C語言中的truncate()函數(shù)與ftruncate()函數(shù)的簡要對比,注意其之間的區(qū)別,需要的朋友可以參考下2015-09-09