请帮助我找出客户端和服务器通信中的问题......
客户端使用以下函数将来自摄像头的JPEG帧每秒发送25次到服务器:
int SendAll(SOCKET &client_socket, string &data){
int result, bytes_sent, sent_total, bytes_remain, package_size;
result = bytes_sent = sent_total = package_size = 0;
bytes_remain = data.size();
while (bytes_remain && !result){
package_size = (bytes_remain<KILOBYTE)?bytes_remain:KILOBYTE;
bytes_sent = send(client_socket, &data[sent_total], package_size, 0);
if (bytes_sent > 0){
bytes_remain-= bytes_sent;
sent_total+= bytes_sent;
}
else if(bytes_sent == SOCKET_ERROR){
result = WSAGetLastError();
break;
}
}
return result;
}
在线程循环中:
while(CAMERA.Stream){
OperationStartTime = GetTickCount();
//RecvBuffer.resize(512);
result = SendAll(CAMERA.Socket, CameraFrame);
if(result != 0){
cout << "error in send - " << result;
CAMERA.Stream = false;
break;
}
if (recv(CAMERA.Socket, &RecvBuffer, 1, 0) < 0){
CAMERA.Stream = false;
break;
}
while(OperationStartTime + StreamRate > GetTickCount()){
if (!CAMERA.Stream){break;}
Sleep(1);
}
}
有时候我会看到“发送错误 - 10053”的提示(在本地测试)。
服务器使用这个函数来接收所有的数据:
int RecvAll(SOCKET &client_socket, string &data){
data = "";
int bytes_received = 0;
int result = 0;
char* recv_buffer;
do {
recv_buffer = (char*)malloc(KILOBYTE);
bytes_received = recv(client_socket, recv_buffer, KILOBYTE, 0);
if (bytes_received > 0){
data.append(recv_buffer, bytes_received);
if (bytes_received < KILOBYTE || data.size() >= 512*KILOBYTE){
bytes_received = result = 0;}
}
else if(bytes_received == SOCKET_ERROR){
data.clear();
result = WSAGetLastError();
}
free(recv_buffer);
}
while (bytes_received > 0);
return result;
}
服务器端没有错误。
在 SendAll
和 RecvAll
函数中出了什么问题,如何实现稳定的数据传输?
PS:有时客户端会停止,只有重新连接才能解决。但如果重新连接,服务器将显示一个新的已连接套接字 - 这意味着 CAMERA.Socket 被阻塞,我不明白为什么。