首页 新闻 会员 周边

网络编程“回声客户端”代码里的一个小问题。

0
悬赏园豆:200 [已解决问题] 解决于 2023-10-08 14:39

基于Linux的实现

基于TCP的服务器端/客户端

首先是回声客户端的代码如下:

#include<sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>

#define SIZE 1024

void error_handling(char *message)
{
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}
int main(int argc,char *argv[])
{
    int sock;
    char message[SIZE];
    int str_len,recv_len,recv_cnt;
    struct sockaddr_in serv_adr;
    
    if(argc!=3)
    {
        printf("Usage:%s <IP> <Port>",argv[0]);
        exit(1);
    }

    sock=socket(PF_INET,SOCK_STREAM,0);
    if(sock==-1)
    {
        error_handling("socket() error");
    }
    memset(&serv_adr,0,sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
    serv_adr.sin_port=htons(atoi(argv[2]));

    if(connect(sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1)
    {
        error_handling("connect() error");
    }
    else 
    {
        puts("Connecetd..........");
    }

    while(1)
    {
        fputs("Input message(Q to quit):",stdout);
        fgets(message,SIZE,stdin);
        
        if(!strcmp(message,"q\n")||!strcmp(message,"Q\n"))
        {
            break;
        }
        str_len = write(sock,message,strlen(message));
        recv_len=0;

        while(recv_len<str_len)
        {
            recv_cnt=read(sock,&message[recv_len],SIZE-1);
            if(recv_cnt==-1)
            {
                error_handling("read() error");
            }
            recv_len+=recv_cnt;    
        }
        message[recv_len]=0;
        printf("Message from server:%s",message);
    }
    close(sock);
    return 0;
}

其中问题是以上代码倒数第六行的 message[recv_len]=0 语句的作用是什么?求解答。

与之配套的回声服务端代码为:

#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>
#include<stdlib.h>

#define SIZE 1024

void error_handling(char *message)
{
  fputs(message,stderr);
  fputc('\n',stderr);
  exit(1);
}
int main(int argc,char *argv[])
{
  int serv_sock,clnt_sock;
  char message[SIZE];
  int str_len,i;

  struct sockaddr_in serv_adr,clnt_adr;
  socklen_t clnt_adr_sz;
  
  if(argc!=2)
  {
    printf("Usage: %s <port> \n",argv[0]);
    exit(1);
  }

  serv_sock= socket(PF_INET,SOCK_STREAM,0);
  if(serv_sock==-1)
  {
    error_handling("socket() error)");
  }
  
  memset(&serv_adr,0,sizeof(serv_adr));
  serv_adr.sin_family=AF_INET;
  serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
  serv_adr.sin_port=htons(atoi(argv[1]));
  
  if(bind(serv_sock,(struct sockaddr *)&serv_adr,sizeof(serv_adr))==-1)
  {
    error_handling("bind() error");
  }

  if(listen(serv_sock,5)==-1)
  {
    error_handling("listen() error");
  }

  clnt_adr_sz=sizeof(clnt_adr);
  for(i=0;i<5;i++)
  {
    clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_adr,&clnt_adr_sz);
    if(clnt_sock==-1)
    {
      error_handling("accept() error");
    }else 
    {
      printf("Connected client %d\n",i+1);
    }
    while((str_len=read(clnt_sock,message,SIZE))!=0)
    {
      write(clnt_sock,message,str_len);
    }
    close(clnt_sock);
    close(serv_sock);
    return 0;
  }

}

代码来自《TCP/IP网络编程》【韩】尹圣雨
其中回声服务端代码在P73,回声客户端代码在P83。

OvOBangBangOxO的主页 OvOBangBangOxO | 初学一级 | 园豆:2
提问于:2023-10-07 20:59
< >
分享
最佳答案
0

0,对应的字符是(Null),其实就是‘\0’,即空字符。判断一个字符串是否结束的标志就是看是否遇到‘\0’,如果遇到‘\0’,则表示字符串结束

收获园豆:200
jiajinzhao | 菜鸟二级 |园豆:460 | 2023-10-08 10:59

感谢感谢!!!

OvOBangBangOxO | 园豆:2 (初学一级) | 2023-10-08 14:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册