C套接字客户端打印出一个奇怪的输出

时间:2013-06-14 17:54:06

标签: c linux sockets tcp send

我正在尝试从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

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

2 个答案:

答案 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);