转载:http://www.jb51.cc/article/p-xcrjsaew-za.html
Socket又称"套接字",用于向网络发出请求或者应答网络请求
Socket工作的示意图:
程序实例:在Cocos2d-X中使用Socket
创建一个Sock类,用于处理Socket
在Sock.h中添加下面的代码
[cpp] view plain copy #ifndef__Sock_H__ #define__Sock_H__ #ifdefWIN32 #include<WinSock2.h> #defineSOCK_TYPESOCKET #else #defineSOCK_TYPEint #defineINVALID_SOCKET-1 #endif #defineMyLog(...) //创建Sock类 classSock { public: //构造函数 Sock(); //析构函数 virtual~Sock(); //设置成非阻塞模式 boolsetNonBlock() SOCK_TYPEfd=_fd; #ifdefWIN32 BOolflg=TRUE; //控制Socket的模式 if(ioctlsocket(fd,FIONBIO,(unsignedlong*)&flg)!=0) returnfalse; } true; #else intflags=fcntl(fd,F_GETFL,0); flags|=O_NONBLOCK; returnfcntl(fd,F_SETFL,flags)!=-1; } //关闭Sock voIDclose() { closesocket(_fd); ::close(_fd); voIDattach(SOCK_TYPEfd) _fd=fd; //判断Sock是否合法 boolisValIDSocket() return_fd!=INVALID_SOCKET; protected: SOCK_TYPE_fd; }; //客户端的Sock classSockClIEnt:publicSock SockClIEnt(unsignedshortport=0,constchar*ip=NulL) if(port==0&&ip==NulL) return; //连接 connect(port,ip); //析构函数 ~SockClIEnt(){} //第一个参数:端口 //第二个参数:ip地址 intconnect(unsignedshortport,87); background-color:inherit; Font-weight:bold">char*ip) //分配一个Socket //第一个参数:AF_INET表示指定地址族(地址描述) //第二个参数:SOCK_STREAM表示流式套接字TCP(Socket类型) //第三个参数:0(协议) _fd=socket(AF_INET,SOCK_STREAM,0); //地址信息结构 structsockaddr_inaddr; //地址家族 addr.sin_family=AF_INET; //端口号 addr.sin_port=htons(port); //主机地址 addr.sin_addr.s_addr=inet_addr(ip); //连接 intret=::connect(_fd,(structsockaddr*)&addr,153); background-color:inherit; Font-weight:bold">sizeof(addr)); if(ret<0) MyLog("connecterrorerrno=%d",errno); return-1; return0; //接收 intrecv(char*buf,intlen) return::recv(_fd,buf,len,0); //发送 intsend(return::send(_fd,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> }; //服务器端的Sock classSockServer: SockServer(unsigned//监听 Listen(port,ip); //虚构函数 ~SockServer(){} //接受连接 SockClIEnt*accept() //接受客户端的发送请求,等待客户端发送connect请求 SOCK_TYPEfd=::accept(_fd,NulL,NulL); if(fd!=INVALID_SOCKET) //创建一个SockClIEnt SockClIEnt*ret=newSockClIEnt; ret->attach(fd); returnret; returnNulL; //第一个参数:端口 //第二个参数:ip地址 intListen(unsignedchar*ip=NulL) //分配一个Socket //第一个参数:AF_INET表示指定地址族(地址描述) //第二个参数:SOCK_STREAM表示流式套接字TCP(Socket类型) //第三个参数:0(协议) _fd=socket(AF_INET,0); //地址信息结果 structsockaddr_inaddr; //地址家族 addr.sin_family=AF_INET; //端口号 addr.sin_port=htons(port); if(ip==NulL) //设置一个不确定的ip地址 addr.sin_addr.s_addr=INADDR_ANY; else //将ip地址转换为32位二进制网络字节序的IPV4地址 //绑定 intret=bind(_fd,153); background-color:inherit; Font-weight:bold">sizeof(addr)); if(ret<0) MyLog("binderror"); return-1; //设置成非阻塞 this->setNonBlock(); //监听 ::Listen(_fd,10); return0; #endif
在Sock.cpp中添加下面的代码
copy #include"Sock.h" //构造函数 Sock::Sock():_fd(INVALID_SOCKET) //初始化Windoes下的Sock staticboolwinInit=false; if(!winInit) winInit=true; WSADATAdata; WSAStartup(MAKEWORD(2,2),&data); //虚构函数 Sock::~Sock() if(isValIDSocket()) close(); }
再创建一个SocketTest类,用于测试Socket
在SocketTest.h中添加下面的代码
#ifndef__SocketTest_H__ #define__SocketTest_H__ #include"cocos2d.h" USING_NS_CC; classSocketTest:publiccclayer public: staticCCScene*scene(); CREATE_FUNC(SocketTest); boolinit(); SockServer*_server; SockClIEnt*_clIEnt; //启动服务器 voIDmakeServer(CCObject*); //启动客服端 voIDmakeClIEnt(CCObject*); //接受连接 voIDAccept(CCObject*); //发送 voIDSend(CCObject*); voIDRecv(CCObject*); #endif
在SocketTest.cpp中添加下面的代码
#include"SocketTest.h" CCScene*SocketTest::scene() CCScene*s=CCScene::create(); SocketTest*layer=SocketTest::create(); s->addChild(layer); returns; boolSocketTest::init() cclayer::init(); CcmenuItemFont*item1=CcmenuItemFont::create("MakeServer",153); background-color:inherit; Font-weight:bold">this,menu_selector(SocketTest::makeServer)); CcmenuItemFont*item2=CcmenuItemFont::create("MakeClIEnt",menu_selector(SocketTest::makeClIEnt)); CcmenuItemFont*item3=CcmenuItemFont::create("Send",menu_selector(SocketTest::Send)); CcmenuItemFont*item4=CcmenuItemFont::create("Recv",menu_selector(SocketTest::Recv)); CcmenuItemFont*item5=CcmenuItemFont::create("Accept",menu_selector(SocketTest::Accept)); Ccmenu*menu=Ccmenu::create(item1,item2,item3,item4,item5,108); List-style:decimal-leading-zero outsIDe; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> addChild(menu); menu->alignItemsvertically(); //启动服务器 voIDSocketTest::makeServer(CCObject*) this->_server=newSockServer(9888); if(!this->_server->isValIDSocket()) cclog("serverERR"); else cclog("serverOK"); voIDSocketTest::makeClIEnt(CCObject*) this->_clIEnt=newSockClIEnt(9888,"127.0.0.1"); this->_clIEnt->isValIDSocket()) cclog("ClIEntERR"); cclog("ClIEntOK"); voIDSocketTest::Accept(CCObject*) this->_server->accept(); cclog("AcceptERR"); cclog("AcceptOK"); voIDSocketTest::Send(CCObject*) //发送信息 intret=this->_clIEnt->send("Hello",6); cclog("send:retis%d",ret); voIDSocketTest::Recv(CCObject*) charbuf[128]; //接收信息 this->_clIEnt->recv(buf,153); background-color:inherit; Font-weight:bold">sizeof(buf)); cclog("recvbufis%s",buf); }
执行结果:
测试SocketTest:
启动两个SocketTest程序,一个做服务器一个做客户端
服务器上单击makeServer,启动服务器
打印Server Ok表示服务器启动成功
客户端单击makeClIEnt,启动客户端
服务器上单击Accept,连接客户端
打印Accept Ok表示接受连接
客户端单击Send,客户端发送消息到服务器
服务器上单击Recv,接收服务器上发来的消息
打印出了"recv buf is Hello"表示服务器上收到了客户端发送的消息
服务器上单击Send,服务器发送消息到客户端
打印出了“send: ret is 6”表示服务器成功的向客户端发送了一个消息
客服端上单击Recv,客户端接收服务器发来的消息
总结
以上是内存溢出为你收集整理的Cocos2d-X中使用Socket全部内容,希望文章能够帮你解决Cocos2d-X中使用Socket所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)