C++使用UDP通訊的實(shí)現(xiàn)示例
對(duì)C++使用UDP做了簡(jiǎn)單封裝,可直接運(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言格式輸出二進(jìn)制的2種方法總結(jié)
眾所周知C中以八進(jìn)制,十進(jìn)制和十六進(jìn)制都可以通過(guò)%o,%d和%x輕松實(shí)現(xiàn),然而唯獨(dú)沒(méi)有提供二進(jìn)制輸出的快速方式,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言格式輸出二進(jìn)制的2種方法,需要的朋友可以參考下2022-08-08C語(yǔ)言中的結(jié)構(gòu)體的入門學(xué)習(xí)教程
這篇文章主要介紹了C語(yǔ)言中的結(jié)構(gòu)體的入門學(xué)習(xí)教程,以struct語(yǔ)句定義的結(jié)構(gòu)體是C語(yǔ)言編程中的重要基礎(chǔ),需要的朋友可以參考下2015-12-12C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法
這篇文章主要介紹了C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(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-06C++11右值引用和移動(dòng)語(yǔ)義的實(shí)例解析
左值和右值都是針對(duì)表達(dá)式,左值是指表達(dá)式結(jié)束后依然存在的持久對(duì)象,右值是指表達(dá)式結(jié)束時(shí)就不再存在的臨時(shí)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于C++11右值引用和移動(dòng)語(yǔ)義的相關(guān)資料,需要的朋友可以參考下2022-09-09簡(jiǎn)要對(duì)比C語(yǔ)言中的truncate()函數(shù)與ftruncate()函數(shù)
這篇文章主要介紹了C語(yǔ)言中的truncate()函數(shù)與ftruncate()函數(shù)的簡(jiǎn)要對(duì)比,注意其之間的區(qū)別,需要的朋友可以參考下2015-09-09QT應(yīng)用啟動(dòng)失敗排查方法小結(jié)
啟動(dòng)QT應(yīng)用經(jīng)常會(huì)碰到應(yīng)用啟動(dòng)失敗,qt platform plugin無(wú)法啟動(dòng),本文就來(lái)介紹一下QT應(yīng)用啟動(dòng)失敗排查方法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解以下2023-09-09C語(yǔ)言實(shí)現(xiàn)停車場(chǎng)管理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言課程設(shè)計(jì)之停車場(chǎng)管理問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12