当前位置: 首页 > 知识库问答 >
问题:

在windows 7 64位上使用TCP/IP套接字发送/接收结构

齐建安
2023-03-14

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

我不明白如何在安全模式下发送带有套接字的结构。

我需要使用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/

用于Windows 7 64位上的发送/接收,在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和硬件。

预先感谢...

共有2个答案

孟开宇
2023-03-14

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

>

  • 发送方是否准确地发送协议指定的字节?如果没有,停止,发送器已损坏。

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

    协议被破坏了,因为发送者和接收者都遵循它,整个系统仍然无法工作。(这种情况会经常发生。要让协议正确需要很多经验。)

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

  • 龙俊德
    2023-03-14

    通过网络发送数据时存在几个问题。

    1. 最简单的假设是,当发送方和接收方使用相同的编译器版本构建,并且都在具有相同(或非常接近)架构(OS、CPU、32/64等)的机器上运行时,您可以“按原样”使用C结构
    2. 在最复杂的情况下,当您对接收器一无所知(不同的操作系统、不同的编程语言等)时,您应该使用其中一种序列化方法:XML表示数据层,HTTP表示协议层,TCP表示传输
    3. 当然,您可以使用库、各种RPC实现等。假设您有p.1(最简单的情况),您应该执行以下操作:
    4. 设置编译器以1字节对齐方式打包结构
    5. 在结构中包括保护:header、footer和length:struct data{char header;//将其设置为某个非常特定的值,例如0x02 int64 length;//将sizeof(data)bool shot;Matrix4x4位置;char footer;//将它设置为某一非常特定的数值,例如0x03}
    6. 开发接收程序以等待标头(传输以0x02开始),然后接收长度(其大小是定义良好的sizeof(int64)),然后读取长度字节并检查页脚(传输以x03停止)
    7. 祝你好运
     类似资料:
    • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如

    • 如何将数据从PHP页面发送到TCP端口? 我正在使用它,但我不能使用任何数据!还有,你知道我怎么才能暂停吗? 有什么问题?

    • 问题内容: 我已经用套接字卡住了4h,我使用的方式是只有一个应用程序作为客户端和服务器,一旦客户端连接, 它将与新客户端一起打开theard,并等待消息。 一旦消息发送到服务器,客户端将收到响应,该部分正在正常工作。 客户专区的一部分: 服务器支持2条消息,第一条是“列表”,发送一条命令是“获取值”。 如果客户端将请求命令“列表”,它将运行以下命令:有一个“服务器/客户端”,它正在发送请求并接收一

    • 问题内容: 我正在建立一个客户-服务器项目。 我需要的是客户端发送一个字符串,例如“ Pendu”,服务器接收该字符串并将一个名为“ Pendu”的对象发送回客户端。 这是我的代码: 该类在包中定义: 我的问题是: 首先,我执行服务器,然后看到控制台中显示的内容。 然后我执行客户端,在控制台中,我收到如下消息: 同时,服务器端未显示任何新内容。 现在,我停止客户端,并显示服务器的所有其他消息: 当

    • 我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask的代码,用于发送消息并从PC接收回复: } 我在onPostExcecute中的祝酒词中显示PC的回复。 Android通过BufferedWriter发送消息,而PC上的java应用程序在BufferedReader中接收消息。 PC在收到

    • 我一直在开发一个简单的python套接字聊天室,客户端和服务器可以在其中相互发送消息。我遇到的问题是服务器和客户端一次只能发送一条消息。我希望它能像任何其他聊天室一样工作,在那里我可以在发送消息时收到消息,任何帮助都会有很大帮助