【发布时间】:2018-09-09 17:28:35
【问题描述】:
我正在通过 TCP/IP 为结构(在我的情况下为“帧”)执行发送和接收功能。但是这些功能似乎没有奏效,我找不到我的错误在哪里。我被要求将所有数据存储在 char 数组中并发送,同时接收 char 数组并将它们转换为结构。
struct frame {
int length;
int * body;
int tail;
};
void winsock_client::send_frame(frame f) {
char * arr;
char * tx;
int length = 8 + f.length * sizeof(int);
arr = new char[length];
tx = (char*)&f.length;
for (int i = 0; i < sizeof(int); i++) {
arr[i] = *(tx++);
}
for (int i = 0; i < f.length; i++) {
tx =(char*)&f.body[i];
for (int j = 0; j < sizeof(int); j++) {
arr[4 + i * sizeof(int) + j] = *(tx++);
}
}
tx = (char*)&f.tail;
for (int i = 0; i < sizeof(int); i++) {
arr[4 + f.length * sizeof(int) + i] = *(tx++);
}
send(client_socket, arr, sizeof(arr), 0);
}
void winsock_server::receive_frame(frame & f) {
int * rx;
recv(server_socket, rx_buffer, sizeof(rx_buffer), 0);
rx =(int *) &rx_buffer[0];
f.length = *rx;
f.body = new int[f.length];
rx = (int *)&rx_buffer[4];
for (int i = 0; i < f.length; i++) {
f.body[i] = *(rx++);
}
rx = (int*)&rx_buffer[16];
f.tail = *rx;
}
谁能告诉我我的函数中有哪些错误?
【问题讨论】:
-
int length = 8 + f.length * sizeof(int);-- 是什么让您确定两个int成员等于8 个字节? Look at this example that shows that sizeof(frame) == 24. -
请记住 TCP 是一个数据流。在任何给定的数据包或致电
recv中,您可能会或可能不会获得您要求的所有数据。例如,当您阅读Frame时,您可能无法获得完整的Frame。检查返回值并继续循环,直到获得所有内容或使用MSG_WAITALL标志阻止,直到所有内容都到达。 -
sizeof(arr)insend_frame()不会返回您认为的结果。 -
是的,我已将 sizeof(arr) 改为 length。还是不行
-
@AndyLin -- 为什么不简单地通过调试检查您发送的内容?您发送的内容是否正确?您将这些数据放在一起,您在哪里进行任何类型的调试以确保您没有发送垃圾或完全错误的数据?
标签: c++ server client winsock raw-data