Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 通过套接字发送文件_Video - Fatal编程技术网

Video 通过套接字发送文件

Video 通过套接字发送文件,video,Video,我在通过套接字发送/接收文件时遇到问题。 例如,在小视频(440MB)中,整个视频都存在干扰(绿色噪声)。 为什么会这样 // server side bool ClientThread::GetFile(char* path, LPDWORD fileSize, LPDWORD bytes) { FileInfo* fileInfo = new FileInfo(); if (!m_client->SyncGetRequest(fileInfo)) {

我在通过套接字发送/接收文件时遇到问题。 例如,在小视频(440MB)中,整个视频都存在干扰(绿色噪声)。

为什么会这样

// server side
bool ClientThread::GetFile(char* path, LPDWORD fileSize, LPDWORD bytes)
{
    FileInfo* fileInfo = new FileInfo();
    if (!m_client->SyncGetRequest(fileInfo))
    {
        delete fileInfo;
        return false;
    }

    *fileSize = fileInfo->parts * fileInfo->partSize + fileInfo->remain;

    HANDLE hFile = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("Creating file is failed!\n");
        delete fileInfo;
        return false;
    }
    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, *fileSize, 0);
    if (!hMap)
    {
        printf("Creating file mapping is failed!\n");
        CloseHandle(hFile);
        delete fileInfo;
        return false;
    }

    void* ptr = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, *fileSize);
    if (!ptr)
    {
        printf("Map View of file has been failed!\n");
        CloseHandle(hMap);
        CloseHandle(hFile);
        delete fileInfo;
        return false;
    }

    for (int i = 0; i < fileInfo->parts; i++)
    {
        int received = m_client->SyncGetRequest((byte*)((DWORD)ptr + i * fileInfo->partSize), fileInfo->partSize);
        if (received != fileInfo->partSize)
            printf("WARNING! Byte mismatch detected! Part: %d\n", i + 1);

        if (received <= 0)
        {
            printf("File receiving is failed! Part: %d\n", i + 1);

            UnmapViewOfFile(ptr);
            CloseHandle(hMap);
            CloseHandle(hFile);

            delete fileInfo;
            return false;
        }
        *bytes += received;
    }

    if (fileInfo->remain > 0)
    {
        int received = m_client->SyncGetRequest((byte*)((DWORD)ptr + fileInfo->parts * fileInfo->partSize), fileInfo->remain);
        *bytes += received;
    }
    UnmapViewOfFile(ptr);

    CloseHandle(hMap);
    CloseHandle(hFile);
    delete fileInfo;
    printf("File successfully received!\n");
    return true;
}
// client side
void Client::SendFile(HANDLE hFile)
{
    DWORD partSize = 4096;
    DWORD size = GetFileSize(hFile, NULL);

    int parts = size / partSize;
    int remain = size - parts * partSize;

    FileInfo fInfo = { parts, partSize, remain };

    if (!SyncSendRequest(&fInfo))
        return;

    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, 0);
    if (hMap)
    {
        void* ptr = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
        if (ptr)
        {
            for (int i = 0; i < parts; i++)
            {
                if (!SyncSendRequest((byte*)((DWORD)ptr + i * partSize), partSize))
                {
                    printf("Error sending file! Part: %d\n", i + 1);
                    break;
                }
            }

            if (remain > 0)
            {
                SyncSendRequest((byte*)((DWORD)ptr + parts * partSize), remain);
            }

            UnmapViewOfFile(ptr);
        }
        CloseHandle(hMap);
    }

    printf("File is sent!\n");
}
//服务器端
bool ClientThread::GetFile(char*path,LPDWORD文件大小,LPDWORD字节)
{
FileInfo*FileInfo=newfileinfo();
如果(!m_client->SyncGetRequest(fileInfo))
{
删除文件信息;
返回false;
}
*fileSize=fileInfo->parts*fileInfo->partSize+fileInfo->remain;
HANDLE hFile=CreateFile(路径,泛型读取,泛型写入,0,NULL,总是创建,文件属性,NULL);
if(hFile==无效的句柄值)
{
printf(“创建文件失败!\n”);
删除文件信息;
返回false;
}
HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,*fileSize,0);
如果(!hMap)
{
printf(“创建文件映射失败!\n”);
闭合手柄(hFile);
删除文件信息;
返回false;
}
void*ptr=MapViewOfFile(hMap,文件映射读取,文件映射写入,0,0,*文件大小);
如果(!ptr)
{
printf(“文件的映射视图已失败!\n”);
闭合手柄(hMap);
闭合手柄(hFile);
删除文件信息;
返回false;
}
对于(inti=0;iparts;i++)
{
接收到的int=m_客户端->同步请求((字节*)((DWORD)ptr+i*文件信息->零件尺寸),文件信息->零件尺寸);
如果(已接收!=文件信息->零件尺寸)
printf(“警告!检测到字节不匹配!部分:%d\n”,i+1);
如果(接收到)保持>0
{
int received=m_client->SyncGetRequest((字节*)((DWORD)ptr+fileInfo->parts*fileInfo->partSize),fileInfo->remain);
*字节+=已接收;
}
未经批准的文件(ptr);
闭合手柄(hMap);
闭合手柄(hFile);
删除文件信息;
printf(“文件成功接收!\n”);
返回true;
}
//客户端
无效客户端::发送文件(句柄hFile)
{
DWORD零件尺寸=4096;
DWORD size=GetFileSize(hFile,NULL);
内部零件=尺寸/零件尺寸;
int剩余=尺寸-零件*零件尺寸;
FileInfo fInfo={parts,partSize,remaine};
如果(!SyncSendRequest(&fInfo))
返回;
HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0);
如果(hMap)
{
void*ptr=MapViewOfFile(hMap,文件映射读取,0,0,0);
如果(ptr)
{
对于(int i=0;i0)
{
SyncSendRequest((字节*)((DWORD)ptr+零件*零件尺寸),保留);
}
未经批准的文件(ptr);
}
闭合手柄(hMap);
}
printf(“文件已发送!\n”);
}
SyncSendData从/向服务器发送和接收响应(1字节)

SyncGetData执行recv并从/向服务器发送响应(1字节)


接收文件的大小与原始文件的大小相匹配。

事实证明,问题不在于传输协议。但从您的屏幕截图可以看出,您正在使用windows media player窗口运行视频

尝试安装一些视频编解码器,然后查看视频播放是否正确

另一种检查文件有效性的简单方法是在两侧执行校验和(它们应该相等)


注意。

事实证明,问题不在于传输协议。但从您的屏幕截图可以看出,您正在使用windows media player窗口运行视频

尝试安装一些视频编解码器,然后查看视频播放是否正确

另一种检查文件有效性的简单方法是在两侧执行校验和(它们应该相等)


问候语< /P>你确定你在另一方有相同的编解码器,也许你收到的是正确的文件,只是因为一些编解码器的问题而不能播放它?哦,天哪!谢谢!我只需要安装一些编解码器!如果这真的有帮助,我已经给它加了一个答案。))SePaPdId有关于如何用C++ +普拉河做同样的事情的想法?@khar Mohan Srivastava,它的C++你确定你在另一边有所有相同的编解码器,也许你收到了正确的文件,只是因为编解码器问题而无法播放?哦,天哪!谢谢!我只需要安装一些编解码器!如果这真的有帮助,我已经为同样的问题添加了一个答案。@Sheppard_u知道如何做同样的事情吗使用C++ + @ PrasHar MhanH-SRistava,其C++