我的代码太长了,无法在此发布,所以我要总结一下是什么问题。
在服务器部分我正在发送套接字3件事:
消息
文件内容
另一条消息
在客户端部分我收到这些东西但是:
首先是在终端上打印
第二个写入新文件
最后在终端上打印
但我的客户仍然坚持阅读,我真的不知道为什么。我问了一个小时的问题,所以如果有人可以帮助我,那就太棒了!
编辑:基本上,我认为我的问题是我不知道服务器上的write
要停止客户端上的read
..是\n
,{ {1}} ..?
以下是代码的两部分:
\0
server
void send_content(t_server *s, FILE *fd, int rfd)
{
int len;
char *buff;
write(s->socket, "150 File status okay;" \
"about to open data connection.\n\0", strlen("150 File status okay;about to open data connection.\n\0"));
fseek(fd, 0, SEEK_END);
len = ftell(fd);
buff = malloc(len * sizeof(char));
read(rfd, buff, len);
write(s->socket, buff, len);
write(s->socket, "\n\0", strlen("\n\0"));
write(s->socket, "226 Closing data connection.\n\0", strlen("226 Closing data connection.\n\0"));
free(buff);
}
client
答案 0 :(得分:0)
char buff[4096];
z = 0;
read(c->fd, buff, 4096);
write(1, buff, strlen(buff));
您应该将调用的返回值保存到read()
,以便找出刚收到的字节数。您可能需要多次拨打read()
才能收到整条消息。使用strlen()
来查找接收到的字节数是错误的,因为缓冲区内容未初始化,并且消息的第一个块可以在任何地方被切断,因此您不能指望它是以null终止的。
答案 1 :(得分:0)
如上所述,您需要一个像this这样的读取功能来确保您收到
指定的字节数(此函数将循环,直到它收到它被告知的字节数)。只需使用此receivall
方法,而不是随处阅读。
对于文件,您通常首先发送文件长度,然后接收文件。
我之前做过类似的事情,希望它会对你有所帮助。这是客户端,它尝试从服务器接收第一个文件长度,然后是文件:
/* create file */
FILE * ptrMyFile = fopen(&filenames[i][0],"wb");
if(NULL == ptrMyFile)
{
printf("Unable to open file \n");
return 1;
}
int size = 0;
int t = 4;
/* first receive file size from server */
/* NOTE: error checking is omitted from code, nevertheless users should stil do some error checking when using this code */
readall(sockfd, (unsigned char*) &size, &t);
/* how many 256 byte chunks are there? */
int div = size / 256;
/* loop to receive each chunk. */
for(int k = 0; k < div; k++)
{
int chunk_size = 256;
/* make sure we receive 256 bytes */
readall(sockfd, buffer, &chunk_size);
/* write to file */
fwrite(buffer, chunk_size, 1, ptrMyFile);
}
/* read the final chunk. */
int whatsleft = size - 256 * div;
readall(sockfd, buffer, &whatsleft);
/* write */
fwrite(buffer, whatsleft, 1, ptrMyFile);
/* close file */
fclose(ptrMyFile);
我将服务器部分留给您。