我正在尝试从Linux服务器客户端向Linux套接字客户端发送.txt文件(我使用环回接口)。我试图发送一个字符串,即“OK”,一切正常,但当我尝试发送文件时,客户端打印出一个奇怪的输出。显然我已经完成了以前的所有步骤,如socket,connect,accept,listen等。
这是服务器端代码:
printf("Sending file\n);
if ((fp=fopen(filename, "r"))!=NULL){
while ( (nbytes = fread(sendline, sizeof(char), 512, fp) > 0)){
printf("%s\n",sendline);
sent = writen(clientfd, sendline, nbytes);
}
close(fp);
}else
perror("Open file");
'writen'功能是:
ssize_t writen(int fd, const void *vptr, size_t n){
/* Write "n" bytes to a descriptor. */
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0; /* and call write() again */
else
return(-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
客户端代码是:
while (fgets(sendline, 10000,stdin) != NULL)
{
sendto(sockfd,sendline,strlen(sendline),0,
(struct sockaddr *)&servaddr,sizeof(servaddr));
read(sockfd,recvline,10000);
fputs(recvline,stdout);
recvline[n]=0;
if((recvline[0]=='-')&&(recvline[1]=='E')&&(recvline[2]=='R')&&(recvline[3]=='R')){
close(sockfd);
exit(1);
}
}
我得到的奇怪客户是图片。 Client Output
那我的错是什么?为什么我会收到这种输出?如何解决?
答案 0 :(得分:1)
您永远不会检查返回的字节数read
(或者是否失败)。即使它确实按照你的假设返回n个字节,你也不会在打印之前将其终止,因此fputs(recvline,stdout)
将打印它在堆栈中未初始化的缓冲区中找到的任何垃圾。
答案 1 :(得分:1)
一些问题,
在服务器代码中,括号位于错误的位置,
while ( (nbytes = fread(sendline, sizeof(char), 512, fp) > 0)){
应该是
while ( (nbytes = fread(sendline, sizeof(char), 512, fp)) > 0){
---------^ parenthesis close here
在客户端,在打印前将'\0'
设置为recvline
n = read(sockfd,recvline,10000);
recvline[n] = '\0'
fputs(recvline,stdout);