我试图在服务器之间将文件发送到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) );
最佳答案
我刚刚查看了您的发送代码。
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/