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

2023-10-27,

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

《C++的socket封装方法是什么.doc》

下载本文的Word格式文档,以方便收藏与打印。