0

我正在尝试从 Linux 服务器客户端(我使用环回接口)向 Linux 套接字客户端发送一个 .txt 文件。我尝试发送一个字符串,即“OK”,一切正常,但是当我尝试发送一个文件时,客户端打印出一个奇怪的输出。显然,我已经完成了所有前面的步骤,如套接字、连接、接受、侦听等。

这是服务器端代码:

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);
  }

}

我得到的奇怪客户在图像中。 客户端输出

那么我的错误是什么?为什么我会收到这种输出,我该如何解决?

4

2 回答 2

1

您永远不会检查read返回的字节数(或是否失败)。即使它确实返回了您假设的 n 个字节,您也不会在打印之前终止缓冲区,因此fputs(recvline,stdout)将打印它在堆栈上的未初始化缓冲区中找到的任何垃圾。

于 2013-06-14T18:28:32.873 回答
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);
于 2013-06-14T18:30:09.090 回答