0

我已经完成了简单的 tcp 客户端/服务器程序,可以很好地处理字符串和字符数据...我想获取每个帧(来自网络摄像头)并将其发送到服务器..这是客户端程序中发生错误的部分:

line:66   if(send(sock, frame, sizeof(frame), 0)< 0)

错误:

client.cpp:66:39:错误:无法将参数 '2' 的 'cv::Mat' 转换为 'const void*' 到 'ssize_t send(int, const void*, size_t, int)

我无法识别此错误....请帮助...以下完整的客户端程序:

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h> 
#include<netinet/in.h>
#include<string.h>
#include<stdlib.h>
#include<netdb.h> 
#include<unistd.h>
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>

using namespace std;
using namespace cv;


int main(int argc,char *argv[])
{
    int sock;
struct sockaddr_in server;
struct hostent *hp;
char buff[1024];
VideoCapture capture;
    Mat frame;
capture.open( 1 );
    if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; }

begin:
capture.read(frame);

if( frame.empty() )
    {
        printf(" --(!) No captured frame -- Break!");
        goto end;
    }

sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
    perror("socket failed");
    exit(1);
}

server.sin_family =AF_INET;

hp= gethostbyname(argv[1]);
if(hp == 0)
{
    perror("get hostname failed");
    close(sock);
    exit(1);
}

memcpy(&server.sin_addr,hp->h_addr,hp->h_length);
server.sin_port = htons(5000);

if(connect(sock,(struct sockaddr *) &server, sizeof(server))<0)
{
    perror("connect failed");
    close(sock);
    exit(1);
}
int c = waitKey(30);
    if( (char)c == 27 ) { goto end; }
if(send(sock, frame, sizeof(frame), 0)< 0)
{
    perror("send failed");
    close(sock);
    exit(1);
}
goto begin;
end:
printf("sent\n",);
close(sock);

    return 0;
   }
4

2 回答 2

1

因为 TCP 提供字节流,所以在通过 TCP 套接字发送内容之前,您必须编写要发送的确切字节。您的使用sizeof不正确。该sizeof函数告诉您系统需要多少字节来存储特定类型。这与数据通过 TCP 连接所需的字节数无关,这取决于您正在实现的 TCP 之上的特定协议,该协议必须指定如何在字节级别发送数据。

于 2013-09-22T05:50:00.270 回答
0
  • 就像大卫已经说过的那样,你弄错了长度。sizeof() 无济于事,你想要的可能是

    frame.total() * frame.channels()

  • 你不能发送一个 Mat 对象,但你可以发送像素(数据指针),所以这将是:

    发送(袜子,frame.data,frame.total()* frame.channels(),0)

    但仍然是个坏主意。通过网络发送未压缩的像素?呸。

    请查看 imencode/imdecode

  • 我很确定,您在这里得到了相反的客户端/服务器角色。通常,服务器保存要检索的信息(网络摄像头),客户端连接到该信息并请求图像。

于 2013-09-22T08:31:19.900 回答