用一个类实现网络通讯功能:<nstream>

来源:互联网 发布:mysql text使用 编辑:程序博客网 时间:2024/04/30 16:52

TCP/IP 通讯

背景或原因: 经常要使用网络通讯,为了方便,编写一个类,使之能像流一样工作。

环境:windows系统、可执行c++程序、网络连接正常

具体功能:完成TCP/IP 通讯。其中TCP服务端、TCP客户端、UDP方式可选,以类似流的方式及使用">>"、"<<"来接收和发送且传输量可选。

使用示例:

#include "nstream.h"int main(){nstream tcps(8000);//选择tcp 服务端 端口:8000char c[6] = "hello";while(1){tcps<<c;//发送6个字符tcps>>c;//接收6个字符}return 0;}

头文件 “nstream.h ”

#include <Windows.h>#pragma comment(lib, "ws2_32.lib")class nstream{public:nstream(const int TcpLocPort4Ser);nstream(const char* TcpRemIpAdd4Cli, const int TcpSerPor4Cli);nstream(const int UdpLocPort,const char* UdpRemIpAdd, const int UdpRemPort);~nstream();int getn();private: bool Init();bool CreateSocket(int type, int protocol);bool BindSock();bool Listen(const int n);bool Accept();bool Connect();//其中T不能使指针类型(数组头指针可以)template<typename T> friend nstream& operator << (nstream& os, const T &Struct){SOCKADDR_IN sockadd = os.StruAdd; //必须赋值if(os.TraType)//UDP{os.num = sendto(os.Sock,(const char*)&Struct,sizeof(Struct), 0,(const sockaddr *)&sockadd, sizeof(SOCKADDR));}else if((os.num = send(os.Sock,(const char*)&Struct,sizeof(Struct), 0)) == SOCKET_ERROR){cout<<"Send Info Error::"<<GetLastError()<<endl;throw("");}return os;}//其中T不能使指针类型(数组头指针可以)template<typename T> friend nstream& operator >> (nstream& in, const T &Struct){int len = sizeof(SOCKADDR);SOCKADDR_IN sockadd;// = in.StruAdd; 必须不赋值if(in.TraType)//UDP{in.num =recvfrom(in.Sock, (char*)&Struct, sizeof(Struct), 0,(SOCKADDR*)&sockadd,&len);}else if((in.num = (in.Sock, (char*)&Struct, sizeof(Struct), 0)) == 0 || in.num == SOCKET_ERROR){cout<<"Recv Info Error::"<<GetLastError()<<endl;throw("");}return in;} private:WSADATA  Ws; //版本号bool TraType; //false->TCP, true->UDPSOCKET Sock; //工作SOCKET ServerSock;//仅TCPS使用struct sockaddr_in StruAdd;int num;//传输的字符数或状态};

源文件"nstream.cpp":

<pre name="code" class="cpp">#include "nstream.h"#include <iostream>using namespace std;//TCP_SERVERnstream::nstream(const int TcpLocPort4Ser):TraType(false), num(0){Init();StruAdd.sin_addr.s_addr = inet_addr("127.0.0.1");// 32位IP地址  htonl (INADDR_ANY) === inet_addr("127.0.0.1")StruAdd.sin_port = htons(TcpLocPort4Ser);// 16位端口号CreateSocket(SOCK_STREAM, IPPROTO_TCP);BindSock();Listen(10);Accept();}//TCP_CLIENTnstream::nstream(const char* TcpRemIpAdd4Cli, const int TcpSerPor4Cli):TraType(false), num(0){ Init();StruAdd.sin_addr.s_addr = inet_addr(TcpRemIpAdd4Cli);StruAdd.sin_port = htons(TcpSerPor4Cli);CreateSocket(SOCK_STREAM, IPPROTO_TCP);Connect();}//UDP_SERVER && CLIENTnstream::nstream(const int UdpLocPort,const char* UdpRemIpAdd, const int UdpRemPort):TraType(true), num(0){Init();StruAdd.sin_addr.s_addr = inet_addr("127.0.0.1");StruAdd.sin_port = htons(UdpLocPort);CreateSocket(SOCK_DGRAM, 0);BindSock();StruAdd.sin_addr.s_addr = inet_addr(UdpRemIpAdd);StruAdd.sin_port = htons(UdpRemPort);}//析构nstream::~nstream(){}//获得传输返回值int nstream::getn(){<span style="white-space:pre"></span>return num;}//初始化bool nstream::Init(){if (WSAStartup(MAKEWORD(2,2), &Ws)){cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;throw("");return false; }if(LOBYTE(Ws.wVersion)!=2 || HIBYTE(Ws.wHighVersion)!=2){WSACleanup();cout<<"Init Windows Socket Failed"<<endl;throw("");return false;}StruAdd.sin_family = AF_INET;// 协议族,必须是AF_INET memset(StruAdd.sin_zero, 0x00, 8);return true;}//创建套接字bool nstream::CreateSocket(int type, int protocol){Sock = ServerSock = socket(AF_INET, type, protocol);if ( Sock == INVALID_SOCKET ) { cout<<"Create Socket Failed::"<<GetLastError()<<endl;throw("");return false;}return true;}//tcps 绑定bool nstream::BindSock(){ if(bind(ServerSock, (struct sockaddr*)&StruAdd, sizeof(sockaddr)) != 0){ cout<<"Bind Socket Failed::"<<GetLastError()<<endl;throw("");return false; }return true;}//tcps 监听bool nstream::Listen(const int n){if (listen(ServerSock, n) != 0){ cout<<"listen Socket Failed::"<<GetLastError()<<endl; throw("");return false;}return false;}//tcps 接受连接请求bool nstream::Accept(){int AddrLen = sizeof(StruAdd);Sock = accept(ServerSock, (struct sockaddr*)&StruAdd, &AddrLen);//-------if (Sock == INVALID_SOCKET ){ cout<<"Accept Failed::"<<GetLastError()<<endl;throw("");return false; }return true;}//tcpC 请求连接bool nstream::Connect(){if(connect(Sock,(struct sockaddr*)&StruAdd, sizeof(StruAdd)) == SOCKET_ERROR ){ cout<<"Connect Error::"<<GetLastError()<<endl;throw("");return false; }return true;}
                                             
0 0
原创粉丝点击