转载:http://www.jb51.cc/article/p-xcrjsaew-za.html
Socket又称"套接字",用于向网络发出请求或者应答网络请求
Socket工作的示意图:
程序实例:在Cocos2d-X中使用Socket
创建一个Sock类,用于处理Socket
- #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