gpt4 book ai didi

c - 通过winsock/linux 套接字发送文件

转载 作者:行者123 更新时间:2023-11-30 14:28:50 26 4
gpt4 key购买 nike

嘿,我正在制作一个发送/接收文件的简单程序,我的代码发送文本文件,但是当涉及到二进制文件时,它开始出现错误,代码:

static void
send_event(conn,file)
void *conn;
void *file;
{
FILE *f;
char *buffer;
int32_t block_size;
int32_t size;
size_t __read;
ConnectionQueue *q;
f = (FILE *)file;
q = (ConnectionQueue *)conn;
block_size = conf_getint("transfer:block_size");
if (block_size <= 1 || block_size > 1024)
{
abort();
return;
}
buffer = (char *)MyMalloc(block_size);
if (!q || !f)
return;

fseek(f,0L,SEEK_END);
size = ftell(f);
if (size == 0L)
{
send_socket(q->conn,"RECEIVE: 302 FSE");
return;
}
fseek(f,0,SEEK_SET);
while (true)
{
if (q->abort)
{
send_socket(q->conn,"RECEIVE: File transfer aborted\n");
if (f)
fclose(f);
f = NULL;
MyFree(buffer);
return;
}
__sleep(100);
__read = fread(buffer,sizeof(char),512,f);
if (__read <= 0)
{
send_socket(q->conn,"RECEIVE: EOF\n");
break;
}
if (*buffer == '\0')
{
send_socket(q->conn,"RECEIVE: EOF\n");
break;
}

send_socket(q->conn,"RECEIVE: %s\n",buffer);
}
send_socket(q->conn,"RECEIVE: 915 EOF\n");
fclose(f);
f = NULL;
MyFree(buffer);
}

已修复:请检查我的答案\/

最佳答案

K&R 语法和 void * 参数有什么用?

static void send_event( ConnectionQueue * conn, FILE * file) {
....

在二进制与文本上,通常这是因为您使用“r”而不是“rb”作为模式打开文件。

 __read = fread(buffer,sizeof(char),512,f);

您应该使用 block_size 而不是 512

if (*buffer == '\0')
...
send_socket(q->conn,"RECEIVE: %s\n",buffer);

您的“二进制文件”可能包含 0 - 这不是一个好的 EOF 标记,如果您在 send_socket 中使用 strlen,您的数据将会被切断在缓冲区的第一个 0 处。

关于c - 通过winsock/linux 套接字发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5532386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com