在这里搜索我的问题,我发现了更多关于此的讨论,但似乎解决方案发送带有套接字的结构并不简单。
我不明白如何在安全模式下发送带套接字的struct。
我需要使用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 }} }};
要发送的每个数据包,都要更改矩阵并且bool为true或false;我需要接收它并且可以访问bool和matrix。
我正在使用PraticalSocket类
http://cs.baylor.edu/~donahoo/practical/CSockets/practical/
用于Windows 7 64位上的发送/接收,在64位项目上使用visual C ++ 2010。
对于发送struct,我这样做:
#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()函数需要一个char缓冲区...所以,这个错误是由于这个......
有人可以给我一个代码示例,帮助我正确地发送和接收这个结构而不会丢失从客户端到服务器的数据吗?
两台PC的架构相同(Windows 7 64位,英特尔处理器,相同的内存和硬件......)
提前致谢...
答案 0 :(得分:2)
通过网络发送数据时存在一些问题。
答案 1 :(得分:2)
TCP连接是字节流。因此,首先根据将要发送和接收的字节来记录您的协议。然后实现代码以精确发送和接收您指定的字节。然后,您可以通过以下技术进行故障排除:
发件人是否准确发送协议指定的字节数?如果没有,请停止,发件人已损坏。
收件人是否正确处理协议指定的字节数?如果没有,停止,接收器坏了。
协议被破坏,因为发送方和接收方都遵循它,整个系统仍然不起作用。 (这种情况会发生很多。要使协议正确,需要很多经验。)
如果您没有在字节级别记录协议,则几乎不可能进行故障排除。所以,请不要跳过这一步。