c - 套接字 c 中的图像已损坏

标签 c sockets

我试图在服务器之间将文件发送到c中的套接字。有时 bmp 文件已完全传输,但大多数时候我得到的图像已损坏。

服务器:

#define BufferLength 100
.
.
.
eofFlag=0;
bufferPointer=(char*)buffer;
do
{
    for (i=0;i<BufferLength;++i)
    {
        ++toSend;
        buffer[i]=getc(f1);
        if (buffer[i]==EOF)
        {
            eofFlag=EOF;
            i=BufferLength;
        }
    }
    sendCode=send(*socketId,bufferPointer,BufferLength*sizeof(int),0);
}while ( (sendCode>0) && (eofFlag!=EOF) );

客户:

#define BufferLength 100
.
.
.
eofFlag=0;
bufferPointer=(char*)buffer;
do
{
    receiveCode=recv(*socketId,bufferPointer,(BufferLength)*sizeof(int),0);
    for (i=0;i<BufferLength;++i)
    {
        putc(buffer[i],f1);
        if (buffer[i]==EOF)
        {
            eofFlag=EOF;
            i=BufferLength;
        }
    }
}while( (receiveCode != SOCKET_ERROR) && (eofFlag!=EOF) );

收到的图片: http://i44.tinypic.com/33jtmk5.jpg

最佳答案

我刚刚查看了您的发送代码。

eofFlag=0;
bufferPointer=(char*)buffer;
do
{

不要这样做,只需执行 read() 来尝试填充整个缓冲区。速度更快。

    for (i=0;i<BufferLength;++i)
    {
        ++toSend;

由于 buffer 是一个 char,所以不能使用 EOF。这只有效,因为如果有效,getch 可以返回 0 到 255 之间的值,如果无效,则返回 -1,一旦将它们转换为 char,-1=255,这样您就会将 EOF 与文件中存储的实际 255 混淆。 只需用 read() 替换整个循环即可。

        buffer[i]=getc(f1);
        if (buffer[i]==EOF)
        {
            eofFlag=EOF;
            i=BufferLength;
        }
    }

在这里,您发送整个缓冲区,无论您上次读取时填充了多少字节。

    sendCode=send(*socketId,bufferPointer,BufferLength*sizeof(int),0);
}while ( (sendCode>0) && (eofFlag!=EOF) );

关于c - 套接字 c 中的图像已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692854/

相关文章:

结构函数指针的编译器处理

c++ - 什么是 C 和 C++ 上下文中的激活记录?

java - 如何解析Netty(java)中的各种对象?

java - 从互联网连接到服务器套接字到通过 LAN 连接到互联网的系统

c - N Queen 在 C 中求解,用文件中的数据替换定义

c++ - 什么是指针旋转?

c - 为结果添加 fopen 时程序将无法运行

php - 在 python 中使用 struct 模块在 pack() 中选择格式

java - 如何在不使用内置库函数 InetAddress.getbyName() 的情况下获取任何主机的 IP 地址?

Python套接字,属性错误str没有属性加密