cocos2dx 跨平台Socket

cocos2dx 跨平台Socket,第1张

概述Sever和Client用的是同一个类,只是使用的函数不同 Sever运行的函数顺序是: Socket.Init(); //初始化库 Socket.Create(AF_INET,SOCK_STREAM,0); //创建socket Socket.Bind(5010);

Sever和ClIEnt用的是同一个类,只是使用的函数不同

Sever运行的函数顺序是:

Socket.Init();                                      //初始化库 Socket.Create(AF_INET,SOCK_STREAM,0);               //创建socket Socket.Bind(5010);                                  //绑定端口 Socket.Listen();                                    //开启监听 Socket.Accept(clIEntsocket,ipClIEnt);               //接受一个客户端请求 clIEntsocket.Recv(recvBuf,64,0);                    //发送消息 clIEntsocket.Send("lIDaha",strlen("lihaha")+1,0);   //接收消息Socket.Close();                                     //关闭socketSocket.Clean();                                     //释放库

ClIEnt运行的函数顺序是:

Socket.Init();                                      //初始化库Socket.Create(AF_INET,0);               //创建socketSocket.Connect("127.0.0.1",5010);                  //链接服务器  Socket.Send("lIDaha",strlen("lIDaha")+1,0);        //发送数据  Socket.Recv(buf,0);                              //接收数据Socket.Close();                                     //关闭socketSocket.Clean();                                     //释放库

Socket类:

Socket.h

#ifndef _ODSOCKET_H_#define _ODSOCKET_H_#ifdef WIN32#include <winsock.h>typedef int             socklen_t;#else#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <fcntl.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <arpa/inet.h>typedef int             SOCKET;#define INVALID_SOCKET -1#define SOCKET_ERROR -1#endifclass Socket {public:    Socket(SOCKET sock = INVALID_SOCKET);    ~Socket();    bool Create(int af,int type,int protocol = 0);    bool Connect(const char* ip,unsigned short port);    bool Bind(unsigned short port);    bool Listen(int backlog = 5);    bool Accept(Socket& s,char* fromip = NulL);    int Send(const char* buf,int len,int flags = 0);    int Recv(char* buf,int flags = 0);    int Close();    int GetError();    static int Init();    static int Clean();    Socket& operator = (SOCKET s);    operator SOCKET ();protected:    SOCKET m_sock;};#endif

Socket.cpp

#include <stdio.h>#include "Socket.h"#ifdef WIN32#pragma comment(lib,"wsock32")#endifSocket::Socket(SOCKET sock){    m_sock = sock;}Socket::~Socket(){}int Socket::Init(){#ifdef WIN32    WSADATA wsaData;    WORD version = MAKEWORD(2,0);    int ret = WSAStartup(version,&wsaData);    if (ret) {        return -1;    }#endif    return 0;}int Socket::Clean(){#ifdef WIN32    return (WSACleanup());#endif    return 0;}Socket& Socket::operator = (SOCKET s){    m_sock = s;    return (*this);}Socket::operator SOCKET (){    return m_sock;}bool Socket::Create(int af,int protocol){    m_sock = socket(af,type,protocol);    if (m_sock == INVALID_SOCKET) {        return false;    }    return true;}bool Socket::Connect(const char* ip,unsigned short port){    struct sockaddr_in svraddr;    svraddr.sin_family = AF_INET;    svraddr.sin_addr.s_addr = inet_addr(ip);    svraddr.sin_port = htons(port);    int ret = connect(m_sock,(struct sockaddr*)&svraddr,sizeof(svraddr));    if (ret == SOCKET_ERROR) {        return false;    }    return true;}bool Socket::Bind(unsigned short port){    struct sockaddr_in svraddr;    svraddr.sin_family = AF_INET;    svraddr.sin_addr.s_addr = INADDR_ANY;    svraddr.sin_port = htons(port);    int opt = 1;    if (setsockopt(m_sock,Sol_SOCKET,SO_REUSEADDR,(char*)&opt,sizeof(opt)) < 0)        return false;    int ret = bind(m_sock,sizeof(svraddr));    if (ret == SOCKET_ERROR) {        return false;    }    return true;}bool Socket::Listen(int backlog){    int ret = Listen(m_sock,backlog);    if (ret == SOCKET_ERROR) {        return false;    }    return true;}bool Socket::Accept(Socket& s,char* fromip){    struct sockaddr_in cliaddr;    socklen_t addrlen = sizeof(cliaddr);    SOCKET sock = accept(m_sock,(struct sockaddr*)&cliaddr,&addrlen);    if (sock == SOCKET_ERROR) {        return false;    }    s = sock;    if (fromip != NulL)        sprintf(fromip,"%s",inet_ntoa(cliaddr.sin_addr));    return true;}int Socket::Send(const char* buf,int flags){    int bytes;    int count = 0;    while (count < len) {        bytes = send(m_sock,buf + count,len - count,flags);        if (bytes == -1 || bytes == 0)            return -1;        count += bytes;    }    return count;}int Socket::Recv(char* buf,int flags){    return (recv(m_sock,buf,len,flags));}int Socket::Close(){#ifdef WIN32    return (closesocket(m_sock));#else    return (close(m_sock));#endif}int Socket::GetError(){#ifdef WIN32    return (WSAGetLastError());#else    return (-1);#endif}
总结

以上是内存溢出为你收集整理的cocos2dx 跨平台Socket全部内容,希望文章能够帮你解决cocos2dx 跨平台Socket所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1079192.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存