在Windows 7 64位上发送/接收带有TCP / IP套接字的结构

时间:2014-04-03 06:17:27

标签: c++ sockets tcp struct

在这里搜索我的问题,我发现了更多关于此的讨论,但似乎解决方案发送带有套接字的结构并不简单。

我不明白如何在安全模式下发送带套接字的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位,英特尔处理器,相同的内存和硬件......)

提前致谢...

2 个答案:

答案 0 :(得分:2)

通过网络发送数据时存在一些问题。

  1. 使用最简单的情况假设,当发送方和接收方使用相同的编译器版本构建并且都在具有相同(或非常接近)架构(OS,CPU,32/64等)的机器上运行时,您可以使用C结构“按原样”。
  2. 对于最复杂的情​​况,当您不了解接收器(不同的OS,不同的编程语言等)时,您应该使用序列化方法之一:数据层的XML表示,协议层的HTTP和传输的TCP。
  3. 当然,您可以使用库,各种RPC实现等。 假设您有第1页(最简单的情况),您应该执行以下操作:
  4. 设置compliler以1字节对齐方式打包结构。
  5. 在struct中包含警卫:页眉,页脚和长度: 结构数据 { char header; //将此值设置为某个非常具体的值,例如0x02 int64长度; // put sizeof(数据)    bool shot;    Matrix4x4位置; char footer; //将此值设置为某个非常具体的值,例如0x03 };
  6. 开发等待标头的接收程序(传输以0x02开始),然后接收长度(其大小定义为sizeof(int64)),然后读取长度字节并检查页脚(传输停止为0x03)
  7. 祝你好运

答案 1 :(得分:2)

TCP连接字节流。因此,首先根据将要发送和接收的字节来记录您的协议。然后实现代码以精确发送和接收您指定的字节。然后,您可以通过以下技术进行故障排除:

  1. 发件人是否准确发送协议指定的字节数?如果没有,请停止,发件人已损坏。

  2. 收件人是否正确处理协议指定的字节数?如果没有,停止,接收器坏了。

  3. 协议被破坏,因为发送方和接收方都遵循它,整个系统仍然不起作用。 (这种情况会发生很多。要使协议正确,需要很多经验。)

  4. 如果您没有在字节级别记录协议,则几乎不可能进行故障排除。所以,请不要跳过这一步。