【发布时间】:2014-04-03 06:17:26
【问题描述】:
在这里搜索我的问题时,我发现了更多关于此的讨论,但似乎解决方案对于发送带有套接字的结构并不简单。
我不明白如何在安全模式下使用套接字发送结构。
我需要使用 struct 发送我的信息,并正确接收它,而不会丢失任何数据。
所以,情况是这样的:客户端必须向服务器发送这个结构:
typedef array<array<double,4>,4> Matrix4x4;
struct data
{
bool shot;
Matrix4x4 position;
};
Matrix4x4 是这样的:
Matrix4x4 T1 = {{
{{-1.0000, 0.0000, -0.0000, 0.1531}},
{{0.0000, 0.0000, -1.0000, 0.1502 }},
{{-0.0000, -1.0000, -0.0000, 1.0790}},
{{0 , 0, 0, 1.0000 }} }};
每一个要发送的数据包,矩阵都改变了,布尔值是真还是假;我需要接收它并且可以访问布尔和矩阵。
我正在使用 PraticalSocket 类
http://cs.baylor.edu/~donahoo/practical/CSockets/practical/
用于在 64 位 Windows 7 上发送/接收,在 64 位项目上使用 Visual C++ 2010。
为了发送结构,我这样做:
#include "PracticalSocket.h"
#include <iostream>
#include <array>
#include <vector>
#include <Windows.h>
#include <cstdlib>
using namespace std;
#define servAddress "192.168.0.117"
const unsigned short SOCKET_SERVER_PORT = 27500;
typedef array<array<double,4>,4> Matrix4x4;
Matrix4x4 T1 = {{
{{-1.0000, 0.0000, -0.0000, 0.1531}},
{{0.0000, 0.0000, -1.0000, 0.1502 }},
{{-0.0000, -1.0000, -0.0000, 1.0790}},
{{0 , 0, 0, 1.0000 }} }}; //example for testing send
//packet to send
struct data{
bool shot;
Matrix4x4 position;
};
struct data primo = {true, T1};
//socket TCP
int main()
{
try{
TCPSocket sock(servAddress, SOCKET_SERVER_PORT);
sock.send(&primo, sizeof(struct data));
}catch(SocketException &e){
cerr << e.what() << endl;
system("PAUSE");
}
cout<<endl<<"Matrix and bool sendend server"<<endl;
return 0;
}
“发送”到服务器正常(来自此客户端,没有错误),但服务器在接收时出错。我注意到 recv() 函数需要一个字符缓冲区......所以,这个错误是由于这个......
有人可以给我一个代码示例,帮助我正确发送和接收这个结构,而不会丢失从客户端到服务器的数据?
两台 PC 的架构相同(Windows 7 64 位,英特尔处理器,相同的 RAM 和硬件..)
提前谢谢...
【问题讨论】:
-
也许这会有所帮助? codeproject.com/Articles/13071/…
-
不要使用
structs作为网络协议。使用网络协议作为网络协议。通过使用struct,您在机器之间引入了六个依赖项。用八位字节定义一个应用程序协议,并为自己编写一个库来发送和接收它。或使用现有协议。 -
我已经更新了我的问题,如果你能帮助我的话。
-
您在未阅读 cmets 的情况下更新了您的问题。使用
struct作为网络协议是个坏主意。您引入了对处理器架构、处理器模式、编译器、编译器版本、编译struct时生效的编译器选项、周围的#pragmas 的依赖关系,...不要这样做。