极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4808|回复: 1

有一个很无语的问题,socket和opencv的malloc不可兼得,请过目

[复制链接]
发表于 2017-7-6 14:57:30 | 显示全部楼层 |阅读模式

picfasong.cpp发送一张图片给picjieshou.cpp,第三次,或者第二次,就会报错误,请帮我分析下吧,谢谢,我真的找不出毛病了,以下是代码,最为奇怪的是,当我删除picjieshou.cpp中第73行的malloc(143);之后,就不会报错了,或者,把picjieshou.cpp中的1024修改为51以下的数字时,就不再报错了,可以无限的发送图片下去。难道malloc使用有什么禁忌
报错信息:
----------------以下为picjieshou.cpp程序运行输出信息-----------------

ready:
here !



---------------1---------------
times:1
len_img:1024
len_img:1024
NOW!!!!!!!!!!!!!!!!!!!
0.5
---------------1---------------




ready:
here !
picjieshou: malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

----------------以上为picjieshou.cpp程序运行输出信息------------------
------------------以下为picfasong.cpp代码-------------------------
#include <sys/types.h>
#include <sys/socket.h>                         // 鍖呭惈濂楁帴瀛楀嚱鏁板簱
#include <stdio.h>
#include <netinet/in.h>                         // 鍖呭惈AF_INET鐩稿叧缁撴瀯
#include <arpa/inet.h>                      // 鍖呭惈AF_INET鐩稿叧鎿嶄綔鐨勫嚱鏁
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h> #include <sys/shm.h>
#include <pthread.h>
#include <highgui.h>
#include <iostream>
#define MYPORT  6666
#define BUFFER_SIZE 1024
using namespace std;
int len_imgdata;
typedef struct
{
    int ab;
    int num[1000000];
}Node;
typedef struct MyIplImage
{
    int  nSize;             /**< sizeof(IplImage) */
    int  ID;                /**< version (=0)*/
    int  nChannels;         /**< Most of OpenCV functions support 1,2,3 or 4 channels */
    int  alphaChannel;      /**< Ignored by OpenCV */
    int  depth;             /**< Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    char colorModel[4];     /**< Ignored by OpenCV */
    char channelSeq[4];     /**< ditto */
    int  dataOrder;         /**< 0 - interleaved color channels, 1 - separate color channels.
                               cvCreateImage can only create interleaved images */
    int  origin;            /**< 0 - top-left origin,
                               1 - bottom-left origin (Windows bitmaps style).  */
    int  align;             /**< Alignment of image rows (4 or 8).
                               OpenCV ignores it and uses widthStep instead.    */
    int  width;             /**< Image width in pixels.                           */
    int  height;            /**< Image height in pixels.                          */
    struct _IplROI *roi;    /**< Image ROI. If NULL, the whole image is selected. */
    struct _IplImage *maskROI;      /**< Must be NULL. */
    void  *imageId;                 /**< "           " */
    struct _IplTileInfo *tileInfo;  /**< "           " */
    int  imageSize;         /**< Image data size in bytes
                               (==image->height*image->widthStep
                               in case of interleaved data)*/
    string imageData;        /**< Pointer to aligned image data.         */
    int  widthStep;         /**< Size of aligned image row in bytes.    */
    int  BorderMode[4];     /**< Ignored by OpenCV.                     */
    int  BorderConst[4];    /**< Ditto.                                 */
    string imageDataOrigin;  /**< Pointer to very origin of image data
                               (not necessarily aligned) -
                               needed for correct deallocation */
}
MyIplImage;
int main( int argc, char **argv )
{
    //sockfd
    int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
       servaddr.sin_port = htons(MYPORT);
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        perror("connect");
        exit(1);
    }
    Node *myNode=(Node*)malloc(sizeof(Node));
    myNode->ab=123;
    myNode->num[0]=110;
    myNode->num[999999]=99;
    IplImage *img=(IplImage*)malloc(sizeof(IplImage));
    IplImage *img_yuanshi = cvLoadImage( argv[1] );
    img->nSize=img_yuanshi->nSize;
    img->ID=img_yuanshi->ID;
    img->nChannels=img_yuanshi->nChannels;
    img->alphaChannel=img_yuanshi->alphaChannel;
    strcpy(img->colorModel,img_yuanshi->colorModel);
    img->dataOrder=img_yuanshi->dataOrder;
    img->depth=img_yuanshi->depth;
    img->origin=img_yuanshi->origin;
    img->align=img_yuanshi->align;
    img->width=img_yuanshi->width;
    img->height=img_yuanshi->height;
    img->imageSize=img_yuanshi->imageSize;
//    strcpy(img->imageData,img_yuanshi->imageData);
    img->imageData=img_yuanshi->imageData;
    img->widthStep=img_yuanshi->widthStep;

//    img->BorderMode=img_yuanshi->BorderMode;
    img->BorderMode[0]=img_yuanshi->BorderMode[0];
    img->BorderMode[1]=img_yuanshi->BorderMode[1];
    img->BorderMode[2]=img_yuanshi->BorderMode[2];
    img->BorderMode[3]=img_yuanshi->BorderMode[3];
    img->BorderConst[0]=img_yuanshi->BorderConst[0];
    img->BorderConst[1]=img_yuanshi->BorderConst[1];
    img->BorderConst[2]=img_yuanshi->BorderConst[2];
    img->BorderConst[3]=img_yuanshi->BorderConst[3];
//    img->imageDataOrigin=img_yuanshi->imageDataOrigin;



    cout<<"img_yuanshi->nSize:"<<img_yuanshi->nSize<<endl;
    cout<<"img_yuanshi->ID:"<<img_yuanshi->ID<<endl;
    cout<<"img_yuanshi->nChannels:"<<img_yuanshi->nChannels<<endl;
    cout<<"img_yuanshi->depth:"<<img_yuanshi->depth<<endl;
    cout<<"img_yuanshi->colorModel:"<<img_yuanshi->colorModel<<endl;
    cout<<"img_yuanshi->alphaChannel:"<<img_yuanshi->alphaChannel<<endl;
    cout<<"img_yuanshi->dataOrder:"<<img_yuanshi->dataOrder<<endl;
    cout<<"img_yuanshi->origin:"<<img_yuanshi->origin<<endl;
    cout<<"img_yuanshi->width:"<<img_yuanshi->width<<endl;
    cout<<"img_yuanshi->height:"<<img_yuanshi->height<<endl;
    cout<<"img_yuanshi->imageSize:"<<img_yuanshi->imageSize<<endl;
//    cout<<"img_yuanshi->strlen(imageData):"<<strlen(img_yuanshi->imageData)<<endl;
    cout<<"img_yuanshi->strlen(imageData):"<<strlen(img->imageData)<<endl;
    cout<<"img_yuanshi->widthStep:"<<img_yuanshi->widthStep<<endl;
    cout<<"img_yuanshi->BorderMode:"<<img_yuanshi->BorderMode<<endl;
    cout<<"img_yuanshi->BorderConst:"<<img_yuanshi->BorderConst<<endl;
//    cout<<"img_yuanshi->imageDataOrigin:"<<img_yuanshi->imageDataOrigin<<endl;
//    cout<<"img->imageDataOrigin:"<<img->imageDataOrigin<<endl;

    int needSend=sizeof(Node);
    char *buffer=(char*)malloc(needSend);
    memcpy(buffer,myNode,needSend);
   
    int needSend_img=sizeof(IplImage);
    char *buffer_img=(char*)malloc(needSend_img);
    memcpy(buffer_img,img_yuanshi,needSend_img);
   
    IplImage *img_huilai=(IplImage*)malloc(sizeof(IplImage));
    memcpy(img_huilai,buffer_img,needSend_img);
    cout<<"fasongqian_length:"<<strlen(buffer_img)<<endl;
    cout<<"img_huilai->imageData:"<<strlen(img_huilai->imageData)<<endl;
    cout<<"OK"<<endl;
    int pos=0;
    int len=0;
    int pos_img=0;
    int len_img=0;
//    while(pos < needSend)
//    {
//        len=send(sock_cli, buffer+pos, BUFFER_SIZE,0);
//        if(len <= 0)
//        {
//            perror("ERRPR");
//            break;
//        }
//        pos+=len;
//    }
//    free(buffer);
//    free(myNode);
    cout<<"all_length:"<<strlen(buffer_img)<<endl;
    while(pos_img < needSend_img)
    {
        len_img=send(sock_cli, buffer_img+pos_img, BUFFER_SIZE,0);
        if(len_img <= 0)
        {
            perror("ERRPR");
            break;
        }
        pos_img+=len_img;
    }
    free(buffer_img);
    free(img);
    len_imgdata=send(sock_cli, img->imageData, img->imageSize,0);
//    close(sock_cli);
    printf("Send over!!!\n");
    return 0;
}

------------------以上为picfasong.cpp代码-------------------------

------------------以下为picjieshou.cpp代码-------------------------

picjieshou.cpp代码
#include<netinet/in.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<highgui.h>
#include<iostream>
#define HELLO_WORLD_SERVER_PORT    6666
#define LENGTH_OF_LISTEN_QUEUE     20
#define BUFFER_SIZE                1024
using namespace std;
int changdu=0,len_imageData=0,needRecv_imageData=284995,pos_imageData=0,times=0;


int main(int argc, char **argv)
{
    int jishu=0;
    struct sockaddr_in   server_addr;
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
    int server_socket = socket(PF_INET, SOCK_STREAM, 0);
    if (server_socket < 0)
    {
        printf("Create Socket Failed!\n");
        exit(1);
    }
    if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
        printf("Server Bind Port: %d Failed!\n", HELLO_WORLD_SERVER_PORT);
        exit(1);
    }
    if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
    {
        printf("Server Listen Failed!\n");
        exit(1);
    }
    for(int i=0;i<50;i++)
    {


   
        struct sockaddr_in client_addr;
        socklen_t          length = sizeof(client_addr);
        int new_server_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
        if (new_server_socket < 0)
        {
            printf("Server Accept Failed!\n");
            break;
        }
    char str1[10], str2[10];
    cout<<"ready:"<<endl;
    cout<<"here !"<<endl;
   
        int needRecv_img=sizeof(IplImage);
        int needRecv_img2=sizeof(IplImage);
        
        malloc(143);
        char *buffer_img=(char*)malloc(144);
    cout<<endl;
    cout<<endl;
    cout<<endl;
    jishu++;
    cout<<"---------------"<<jishu<<"---------------"<<endl;
        int pos_img=0;
        int len_img;
        

    while(pos_img < needRecv_img)
    {
   
    times++;   
    cout<<"times:"<<times<<endl;
        len_img = recv(new_server_socket, buffer_img, 1024, 0);
    cout<<"len_img:"<<len_img<<endl;
        len_img = 1024;
    cout<<"len_img:"<<len_img<<endl;
        if (len_img < 0)
        {
        printf("Server Recieve Data Failed!\n");
        break;
        cout<<"here !-------------1"<<endl;
        }
        pos_img+=len_img;
   
    }
//    times=0;
    cout<<"NOW!!!!!!!!!!!!!!!!!!!"<<endl;
   
    cout<<"0.5"<<endl;
    cout<<"---------------"<<jishu<<"---------------"<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
   


        free(buffer_img);


    }
}
------------------以上为picjieshou.cpp代码-------------------------




回复

使用道具 举报

发表于 2020-8-13 16:32:27 | 显示全部楼层














回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-9-19 23:54 , Processed in 0.044851 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表