今天总结一下Socket的使用方法吧,有在百度。。上面找到的(下面有百度的链接,写的不全的地方,大家可以看一下链接,)。。。如果哪位大神有更换的demo,求分享!!!
Cocos2d-x中有关网络请求的:get post put delete(后两者我在开发中很少用),还有就是 Socket(用于及时通讯,网络游戏中的队友通话)。
在vs下面新建一个一个工程(记住不是Cocos项目!!!)C++文件。作为Server
百度上面的相关解释:http://baike.baidu.com/view/2355183.htm?fr=aladdin
ServerDemo.cpp:
// WebSocketDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include "windows.h"
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
//Windows下面的网络编程
WORD wVersionRequested;
WSADATA wsaData; //用于接受Windows Socket 的结构信息
int err;
wVersionRequested = MAKEWORD(1,1); //请求1.1版本的windows 库
err = WSAStartup(wVersionRequested,&wsaData);
if (err !=0)
{
return -1; //返回值为 0 表示 成功申请 WSAStartup
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){
//检测低字节是不是 1 高字节是不是 1 ,确定是不是我们请求的 1.1版本
WSACleanup(); // 否则用这个函数清除信息,结束
return -1;
}
/************************************************************************/
/* 以上是windows需要添加的内容,Mac下面不用添加,直接抄写就行,每次都一样,以下才是服务器端需要写的代码 */
/************************************************************************/
// 1. 创建Socket
//类型 、流式Socket 、协议
int socket_fd = socket(AF_INET,SOCK_STREAM,PF_UNSPEC);
if (socket_fd == -1){//如果socket返回 -1就 返回,防止崩。。。。
printf("Server Socket Err");
return -1;
}
// 2. bind 绑定
sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET; //一般来说AF_INET(地址族)PF_INET(协议族)
serverAddress.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
serverAddress.sin_port = htons(7777); //必须 加上 htons
int bind_fd = bind(socket_fd,(sockaddr*)(&serverAddress),sizeof(serverAddress));
if (bind_fd == -1){
printf("bind fiald");
return -1;
}
// 3 .Listen 监听
if (listen(socket_fd,2) == -1){
printf("listen faild");
return -1;
}
// 4 .accept
int client_fd;
sockaddr_in clientAddress;
int s = sizeof(clientAddress);
client_fd = accept(socket_fd,(sockaddr *)&clientAddress,&s);
if (client_fd == -1){
printf("accept falid");
return -1;
}
// 5 . receive
while (true)
{
char buf[100];
int recv_data = recv(client_fd,buf,100,0);
if (recv_data == -1){
printf("receive falid\n");
continue;
}else if(recv_data == 0){
closesocket(socket_fd);
}else{
// 6 .send 发送数据
printf("%s\n",buf); //打印客户端发来的数据
char sentData[100];
std::cin.getline(sentData,100,'\n'); //获取一行数据,以‘\n’结束
int sendLenght = send(client_fd,sentData,100,0);
if (sendLenght == -1){
printf("send falid");
continue;
}
}
}
// 7 . close
closesocket(client_fd);
return 0;
}
下面是客户端:
ClientDemo.cpp
// ClientSocketDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include "windows.h"
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsaData; //用于接受Windows Socket 的结构信息
int err;
wVersionRequested = MAKEWORD(1,1); //请求1.1版本的windows 库
err = WSAStartup(wVersionRequested,&wsaData);
if (err !=0)
{
return -1; //返回值为 0 表示 成功申请 WSAStartup
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){
//检测低字节是不是 1 高字节是不是 1 ,确定是不是我们请求的 1.1版本
WSACleanup(); // 否则用这个函数清除信息,结束
return -1;
}
// 1 . socket,
int socket_fd = socket(AF_INET,SOCK_STREAM,PF_UNSPEC);
if (-1 == socket_fd){
printf("client socket falid");
return -1;
}
// 2 . contect
sockaddr_in setverAddress; //服务器的地址
setverAddress.sin_port = htons(2223); //iP
setverAddress.sin_family = AF_INET;
setverAddress.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int connect_fd = connect(socket_fd,(sockaddr *)&setverAddress,sizeof(setverAddress));
if (connect_fd == -1){
printf("contect falid ");
return -1;
}
// 3 send
while (true)
{
char sendData[100];
std::cin.getline(sendData,100,'\n');
if (send(socket_fd,sendData,100,0) == -1){
printf("send faild");
continue;
}
// 4 . receive
char receData[100];
int receLen = recv(socket_fd,receData,100,0);
if (receLen == -1){
printf("received faild ");
continue;
}
printf("%s\n",receData); // 输出服务器传过来的
}
// 5. close
closesocket(socket_fd);
getchar();
return 0;
}
先启动Server ,在启动 client