日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

UDP(socket)接和数据案例封装成C++代码

發布時間:2024/9/27 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UDP(socket)接和数据案例封装成C++代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 配置QT下的pro文件

  • TEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG -= qt ? LIBS += -lWs2_32?? ##標示使用window下的Ws2_32.lib-l表示要鏈接后面的庫 #-lWs2_32link Ws2_32.lib ? SOURCES += main.cpp \ ??? udp.cpp ? HEADERS += \ ??? udp.h

    ?

  • 編寫udp.h文件

  • #ifndef UDP_H

    #define UDP_H

    ?

    #ifdef MYLINUX

    #include <sys/types.h>

    #include <sys/socket.h>

    #include <arpa/inet.h>

    #include <unistd.h>

    #define SOCKET int

    #else

    #include <winsock2.h>

    #endif

    ?

    class myudp

    {

    private:

    ??? SOCKET st;//類的內部成員一般是不暴露在類外部的

    public:

    ??? myudp();

    ??? myudp(const myudp &it);

    ??? ~myudp();

    int socket_bind(short int port);

    int socket_send(const char *IP, const char *buf, int len);

    int socket_recv(char *buf, int len, char *srcIP);

    };

    ?

    #endif // UDP_H

    ?

    3.編寫udp.cpp

    #include <stdio.h> #include <string.h> #include "udp.h" ? int myudp::socket_send(const char *IP, const char *buf, int len) { ??? //建立一個socket,第一個參數是指定socket要用那個協議,AF_INET代表要用TCP/IP協議 ??? //第二個參數SOCK_DGRAM意思是要用UDP協議 ??? //第三個參數一般默認填0 ??? st = socket(AF_INET, SOCK_DGRAM, 0);//定義一個socket ??? struct sockaddr_in addr; ??? memset(&addr, 0, sizeof(addr));//初始化結構addr; ??? addr.sin_family = AF_INET;//代表要使用一個TCP/IP的地址 ??? addr.sin_port = htons(8080);//host to net short ??? addr.sin_addr.s_addr = inet_addr(IP); ??? //unsigned long laddr = inet_addr("192.168.6.200"); ??? //unsigned char *p = &laddr; ??? //printf("%u,%u,%u,%u\n", *(p), *(p + 1),*(p + 2), *(p + 3)); ? ??? size_t rc = 0; ??? //發送udp數據 ??? rc = sendto(st, buf, len, 0, (struct sockaddr *)&addr, sizeof(addr)); ??? return rc; } ? int myudp::socket_recv(char *buf, int len, char *srcIP) { ??????? struct sockaddr_in sendaddr; ??????? memset(&sendaddr, 0, sizeof(sendaddr)); ? #ifdef MYLINUX ??????? socklen_t addrlen; #else ??????? int addrlen; #endif ??????? addrlen = sizeof(sendaddr); ??????? memset(buf, 0, len); ??????? //接收udp數據 ??????? size_t rc = recvfrom(st, buf, len, 0, (struct sockaddr *)&sendaddr, &addrlen); ??????? //inet_ntoa(sendaddr.sin_addr);//這個函數是不可重入函數 ??????? if (srcIP) ??????????? strcpy(srcIP, inet_ntoa(sendaddr.sin_addr)); ??? return rc; } ? myudp::myudp() { #ifndef MYLINUX ??? //初始化socket ??? DWORD ver; ??? WSADATA wsaData; ??? ver = MAKEWORD(1, 1);//在調用WSAStatrtup要告訴widnows,我用什么版本的socket ??? WSAStartup(ver, &wsaData);//windows要求,只要用socket,第一步,必須調用這個函數 ??? //初始化socket完成 ??? //建立一個socket,第一個參數是指定socket要用那個協議,AF_INET代表要用TCP/IP協議 ??? //第二個參數SOCK_DGRAM意思是要用UDP協議 ??? //第三個參數一般默認填0 ??? st = socket(AF_INET, SOCK_DGRAM, 0);//定義一個socket #endif } ? myudp::myudp(const myudp &it) { } ? myudp::~myudp() { #ifdef MYLINUX ??? close(st); #else ??? closesocket(st);//使用完socket要將其關閉 ??? WSACleanup();//釋放win socket內部的相關資源 #endif } ? int myudp::socket_bind(short port) { ??? struct sockaddr_in addr; ??? //初始化結構addr; ??? memset(&addr, 0, sizeof(addr)); ??? //代表要使用一個TCP/IP的地址 ??? addr.sin_family = AF_INET; ??? //host to net short ??? addr.sin_port = htons(port); ??? //做為接收方,不需要指定具體的IP地址,接收的主機是什么IP,我就在什么IP上收數據 ??? addr.sin_addr.s_addr = htonl(INADDR_ANY); ??? int rc = 0; ??? return bind(st, (struct sockaddr *)&addr, sizeof(addr)); }

    4.main.c的實現代碼

    #include <iostream> #include "udp.h" ? using namespace std; ? int main(int argc, char *args[]) { ??? if (argc > 1) ??? { ??????? myudp udp; ??????? char buf[1024] = {0}; ??????? while(1) ??????? { ??????????? memset(buf, 0, sizeof(buf)); ???? ???????gets(buf); ??????????? udp.socket_send(args[1], buf, strlen(buf)); ??????????? if (strncmp(buf, "exit", 4) == 0) ??????????????? break; ??????? } ??? } ??? else ??? { ??????? myudp udp; ??????? char buf[1024] = {0}; ??????? if (udp.socket_bind(8080) > -1) ??????? { ??????????? char ip[100] = {0}; ??????????? while(1) ??????????? { ??????????????? memset(buf, 0, sizeof(buf)); ??????????????? memset(ip, 0, sizeof(ip)); ??????????????? udp.socket_recv(buf, sizeof(buf), ip); ??????????????? if (strncmp(buf, "exit", 4) == 0) ??????????????????? break; ??????????????? cout << buf << endl; ??????????????? cout << ip << endl; ??????????? } ??????? } ??? } ? ??? cout << "over" << endl; ??? return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的UDP(socket)接和数据案例封装成C++代码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。