我试图在服务器之间将文件发送到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) );
答案 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标头后,接收器可以知道需要接收多少数据。