插座c中的图像已损坏

时间:2013-12-19 22:22:36

标签: 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

3 个答案:

答案 0 :(得分:1)

我只看了你的发送代码。

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

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

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

由于缓冲区是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) );

答案 1 :(得分:0)

您的代码不正确。从FD复制到C中的套接字的规范方法如下:

int count;
char buffer[4096]; // or more, whatever you like
int count;
while ((count = read(inFD, buffer, 0, sizeof buffer)) > 0)
{
    send(outFD, buffer, 0, count, 0);
}

答案 2 :(得分:0)

首先,如果您的缓冲区长度超过您定义的大小,将会发生什么,因此在这种情况下我们总是必须使用DMA。然后你必须打开文件。使用fseek()转到SEEK_END。使用ftell()&amp ;;以字节为单位判断文件大小然后分配ftell()+ 1讲述的大小的缓冲区。读取文件,然后通过ftell()告诉的长度发送它。

在通过另一端接收数据时,您需要使用select call并继续读取,直到您通过接收套接字读取任何数据(因为您没有发送文件大小,我建议您发送文件在它上面应用http标头后,接收器可以知道需要接收多少数据。