千家信息网

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

发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,本篇内容介绍了"C++的socket封装方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.
千家信息网最后更新 2025年11月14日C++的socket封装方法是什么

本篇内容介绍了"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

  • #include

  • #include /* See NOTES */

  • #include


  • #define SOCKET int


  • #else

  • #include

  • #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

  • #include

  • #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,第一个参数是指定socket要用哪个协议,AF_INET代表要用TCP/IP协议

  • //第二个参数SOCK_DGRAM意思是要用UDP协议

  • //第三个参数一般默认填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;


  • //发送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;//来自发送方的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);//这个函数是不可重入函数

  • //多线程调用,这个函数会出问题

  • 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,第一步,必须调用这个函数

  • //初始化完成

  • #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接受数据

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


  • return bind(st, (struct sockaddr *)&addr, sizeof(addr)); //将端口号和程序绑定

  • }

4.main.c的实现代码

  • #include

  • #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封装方法是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0