溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++的socket封裝方法是什么

發(fā)布時間:2021-11-30 17:58:45 來源:億速云 閱讀:244 作者:iii 欄目:開發(fā)技術

本篇內容介紹了“C++的socket封裝方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.配置QT下的pro文件

  • TEMPLATE = app

  • CONFIG += console

  • CONFIG -= app_bundle

  • CONFIG -= qt

  •  

  • LIBS += -lWs2_32 ##標示使用window下的Ws2_32.lib,-l表示要鏈接后面的庫

  • #-lWs2_32,link Ws2_32.lib

  •  

  • SOURCES += main.cpp \

  •     udp.cpp


  • include(deployment.pri)

  • qtcAddDeployment()


  •  

  • HEADERS += \

  •     udp.h

2.編寫udp.h文件

  • #ifndef UDP_H

  • #define UDP_H


  • #ifdef MYLINUX


  • #include <unistd.h>

  • #include <arpa/inet.h>

  • #include <sys/types.h> /* See NOTES */

  • #include <sys/socket.h>


  • #define SOCKET int


  • #else

  • #include <winsock2.h>

  • #endif


  • class myudp

  • {

  • private:

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

  • public:

  •     myudp();

  •     ~myudp();


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

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

  • int socket_bind(short int port);

  • };


  • #endif // UDP_H

3.編寫udp.cpp

  • #include <string.h>

  • #include <stdio.h>

  • #include "udp.h"


  • //#define MYLINUX ---- linux 下 makefile文件定義 -DMYLINUX






  • int myudp::socket_send(const char * IP,const char *buf, int len)

  • {


  •     st = socket(AF_INET, SOCK_DGRAM, 0);

  •     //建立一個socket,第一個參數(shù)是指定socket要用哪個協(xié)議,AF_INET代表要用TCP/IP協(xié)議

  •     //第二個參數(shù)SOCK_DGRAM意思是要用UDP協(xié)議

  •     //第三個參數(shù)一般默認填0

  •     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);

  •     //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;


  •     //發(fā)送udp數(shù)據(jù)

  •     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;//來自發(fā)送方的IP地址

  •     memset(&sendaddr,0,sizeof(sendaddr));


  • #ifdef MYLINUX

  •     socklen_t len;

  • #else

  •     int addrlen;

  • #endif

  •     addrlen = sizeof(sendaddr);



  •     memset(buf,0,len);

  •     size_t rc = recvfrom(st,buf,len,0,(struct sockaddr *)&sendaddr,&addrlen);

  •     //inet_ntoa(sendaddr.sin_addr);//這個函數(shù)是不可重入函數(shù)

  •     //多線程調用,這個函數(shù)會出問題

  •     if(srcIP)

  •         strcpy(srcIP,inet_ntoa(sendaddr.sin_addr));

  •     //printf("%s:\n%s\n", srcIP, buf);

  • return rc;

  • }


  • myudp::myudp()

  • {

  • #ifndef MYLINUX

  •     //初始化socket

  •     DWORD ver;

  •     WSADATA wsaData;

  •     ver = MAKEWORD(1,1);//在調用WASStartup要告訴windows,我用什么版本的socket

  •     WSAStartup(ver, &wsaData);//windows要求,只要用socket,第一步,必須調用這個函數(shù)

  •     //初始化完成

  • #endif


  •     st = socket(AF_INET,SOCK_DGRAM,0);//定義一個socket


  • }



  • myudp::~myudp()

  • {

  • #ifdef MYLINUX

  •     close(st);

  • #else

  •     closesocket(st);//關閉socket

  •     WSACleanup();//釋放win socket內部的相關資源

  • #endif

  • }



  • int myudp::socket_bind(short port)

  • {

  •     struct sockaddr_in addr;

  •     memset(&addr,0,sizeof(addr));//初始化addr

  •     addr.sin_family = AF_INET;//代表要使用一個TCP/IP的地址

  •     addr.sin_port = htons(port);

  •     addr.sin_addr.s_addr = htonl(INADDR_ANY);//作為接收方,不需要指定具體的IP地址,接受的主機是什么IP,我就在什么IP接受數(shù)據(jù)

  •     //addr.sin_addr.s_addr = inet_addr("192.168.2.100");


  •     return bind(st, (struct sockaddr *)&addr, sizeof(addr)); //將端口號和程序綁定

  • }

4.main.c的實現(xiàn)代碼

  • #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 (strcmp(buf, "exit") == 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 << ip << endl;

  •                 cout << buf << endl;

  •             }

  •         }

  •     }


  •     cout << "over" << endl;

  •     return 0;

  • }

“C++的socket封裝方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI