【发布时间】:2014-09-08 02:14:18
【问题描述】:
我正在编写一个程序来发送和另一个程序通过套接字接收图像流。笼统地说:
在客户端:我获取图像并在客户端对其进行预可视化。然后我通过套接字发送它。
在服务器端:我等待图像,然后对其进行预可视化。
这里是socket相关的sn-ps代码:
已编辑:
客户端
unsigned int bytes = 0;
for (int i = 0; i < imgSize; i += bytes) {
if ((bytes = send(clientSocket->getSocketDescriptor(), (char*)inputImage.data + i, imgSize - i, 0)) == 0) {
assert(false);
}
std::cout << "Sent: " << bytes << std::endl;
}
char notifyChar[1];
recv(clientSocket->getSocketDescriptor(), notifyChar , 1 , 0);
服务器端
unsigned int bytes = 0;
for (int i = 0; i < imgSize; i += bytes) {
if ((bytes = recv(serverQuads.getSocketDescriptor(0), (char *)sockData + i, imgSize - i, 0)) == -1) {
assert(false);
}
std::cout << " Received: " << bytes << std::endl;
}
char notifyChar[1] = { '0' };
send(serverQuads.getSocketDescriptor(0),notifyChar , 1, 0);
图像大小为 57600(imgSize 由 3 个 const(WIDTH、HEIGHT 和 CHANNELS)计算得出,send() 返回该值。但是服务器只接收到 53504 字节,所以它返回到recv() 但没有任何反应。它一直在无休止地等待其他 4096 字节。
我现在有点困惑。我阅读了很多帖子,但找不到问题所在。有人可以帮帮我吗?
已解决:
错误出在这个 sn-ps 之外。另一个线程正在从 socketDescriptor 读取并等待正好 4096 个字节。所以,现在一切都很好。
【问题讨论】:
-
首先你要记住TCP是一个streaming协议,它并没有真正的“数据包”,它只是一个数据流,也就是说如果您发送两个“数据包”,它们可能会在另一端作为一个接收。另外,您确定两端的数据包大小相等吗?在两端打印出
PACKET_SIZE。 -
您使用的是 TCP 还是 UDP 哪个协议?为什么不使用库来处理这样的事情呢?
-
TCP 还是 UDP?为什么即使
bytes != 2400仍打印“已接收:2400 字节”? -
另请注意,除非图像大小是
PACKET_SIZE的倍数,否则您不会发送完整的图像。 -
recv 只得到部分缓冲区是正常的。一定要注意recv返回的值,一直调用recv,直到有完整的画面。您可能还会得到一张完整的图片以及下一张的一部分。您的代码负责将部分正确地重新组合在一起。