SOCKET 收到数据后如何处理???

sforiz 2008-12-31 10:53:45
从客户端发送X,Y,Z坐标信息到服务器,服务器在收到这些数据之后把它传给其它客户端,其它客户端怎样获取这些坐标数据呢,也就是怎样解析或翻译这些数据。
我在做一个小的游戏实例,但在服务器把数据传给客户端之后,不知道怎么处理、解析。
...全文
212 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sforiz 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rick29 的回复:]
如果对性能要求不高,可以考虑直接用CSocket类,并配以一个可以序列化的类(该类中包含了你的X、Y、Z成员)来实现。
这样的好处是,你想把你的类发送到SOCKET,就向CSocket去序列化;你想把你的类存到文件,就向CFile去序列化。总之,有了序列化,想往哪里存都OK。
[/Quote]

性能无所谓
rick29 2009-01-07
  • 打赏
  • 举报
回复
如果对性能要求不高,可以考虑直接用CSocket类,并配以一个可以序列化的类(该类中包含了你的X、Y、Z成员)来实现。
这样的好处是,你想把你的类发送到SOCKET,就向CSocket去序列化;你想把你的类存到文件,就向CFile去序列化。总之,有了序列化,想往哪里存都OK。
sforiz 2009-01-07
  • 打赏
  • 举报
回复
我做的是将游戏中小动物移动时产生的坐标信息,传到一个服务器,服务器把数据传回,在客户端调用函数使小动物移动。通信用的是TCP、SOCKET,程序语言C++,对等的C/S结构。知道的说一下,先谢谢了,如果问题在今天内解决可以加50分。
sforiz 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 weichaichang 的回复:]
我在下载区上传过这样的程序,去下载区看看吧。你不需要做具体的解析工作。只是需要关注数据的发送和接收问题。接收的时候,如果简单的话,就在线程里处理一下数据,正规的话,就用消息响应,在消息响应函数里处理。
[/Quote]


能发一下你上传的资源的链接吗?
weichaichang 2009-01-07
  • 打赏
  • 举报
回复
我在下载区上传过这样的程序,去下载区看看吧。你不需要做具体的解析工作。只是需要关注数据的发送和接收问题。接收的时候,如果简单的话,就在线程里处理一下数据,正规的话,就用消息响应,在消息响应函数里处理。
sforiz 2009-01-04
  • 打赏
  • 举报
回复
void InitKeyboard(HINSTANCE hInstance){//初始键盘设备、、、

DirectInput8Create(hInstance,DIRECTINPUT_VERSION,IID_IDirectInput8,(LPVOID*)&g_pInput,NULL);
g_pInput->CreateDevice(GUID_SysKeyboard,&g_pInputDevice,NULL);
g_pInputDevice->SetDataFormat(&c_dfDIKeyboard);
g_pInputDevice->SetCooperativeLevel(hWnd,DISCL_NONEXCLUSIVE|DISCL_FOREGROUND|DISCL_NOWINKEY);
g_pInputDevice->Acquire();

}
int ReadKeyboard()//获取按键
{
int key=0;
g_pInputDevice->GetDeviceState(sizeof(g_state),g_state);
if(0x80&g_state[DIK_RIGHT])
key=4;
if(0x80&g_state[DIK_LEFT])
key=3;
if(0x80&g_state[DIK_UP])
key=1;
if(0x80&g_state[DIK_DOWN])
key=2;
return key;

}
.......
switch (ReadKeyboard()){

case 3:{x--;break;}
case 4:{x++;break;}
case 1:{z--;break;}
case 2:{z++;break;}
}
用TCP通信怎样获取其中按的键,
#include "stdafx.h"
#include "winsock.h"

WSADATA wsaData; // 初始化WSA时使用
SOCKET s; // socket
SOCKADDR_IN ServerAddr; // 服务器地址
int Port=9000; // 服务器端口

int _tmain(int argc, _TCHAR* argv[])
{
WSAStartup(MAKEWORD(2,2),&wsaData) ; //启动winsock的库;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) ; //初始化socket

ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(Port);
ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
connect(s,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr));
send(s,"From a client",13,0);
while(1){
char buf[256];
memset(buf,0,sizeof(buf));
scanf("%s",buf);
send(s,buf,sizeof(buf),0);
memset(buf,0,sizeof(buf));
recv(s,buf,sizeof(buf),0);
printf("%s\n",buf);
}
closesocket(s);//关闭socket,关闭WSA
return 0;
}
sforiz 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
客户端和服务端需要有一个统一的协议来定义这个结构,双方都知道怎么解析和拼接
[/Quote]

TCP
zaodt 2009-01-01
  • 打赏
  • 举报
回复
这个就是你自己定义的【协议】。


x y z 三个坐标,假如使用 int 变量来存储的话,那么就是 12 个字节;

就像 1 楼说的,把它们定义为一个结构体,然后发送;

收到后,然后按顺序一个个取出来即可。



你自己试着写写看,遇到具体问题再来问。
yang_fujiang 2009-01-01
  • 打赏
  • 举报
回复
LZ
LS的诸位仁兄都已经讲得很清楚了呢
如果你对OSI通讯协议层了解一点儿的话
其实都是定义好数据机构进行组包 解包的
oyljerry 2009-01-01
  • 打赏
  • 举报
回复
客户端和服务端需要有一个统一的协议来定义这个结构,双方都知道怎么解析和拼接
wiowei 2008-12-31
  • 打赏
  • 举报
回复
怎么发的就怎么收呀?用了结构体?
typedef struct pos
{
int x;
int y;
int z;
} point;
point p[100];
char buff[1000];
//比如每次发10个
int len = sizeof(point)*10;
memcpy(buff,p,len);
serversocket.Send(buff,len);
...
//接收
clientsocket.Receive(buff,len);
memcpy(p,buff,len);

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧