• 5407阅读
  • 0回复

C++ TCP  为什么发送的数据和键盘输入的有出入? [复制链接]

上一主题 下一主题
离线zhangyujin78
 
只看楼主 倒序阅读 楼主  发表于: 2009-10-28
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
C++ TCP  为什么发送的数据和键盘输入的有出入? 代码
include....
include....


void * for_clicent(void *data)
{          
      int retval,len, maxfd = -1 ,MAXBUF=1024;
        fd_set rfds;//定义集合
        int new_server_socket = (int)data;
        struct timeval tv;      
       char sendbuf[MAXBUF];
        char revbuf[MAXBUF];
        bzero(sendbuf, MAXBUF + 1);
        fgets(sendbuf,MAXBUF, stdin);
      while(1)
    {
          /* 把集合清空 */
           FD_ZERO(&rfds);
            /* 把标准输入句柄0加入到集合中 */
            FD_SET(0, &rfds);
            maxfd = 0;
            /* 把当前连接句柄new_fd加入到集合中 */
            FD_SET(new_server_socket, &rfds);
            if (new_server_socket> maxfd)
                maxfd = new_server_socket;
            /* 设置最大等待时间 */
            tv.tv_sec = 1;
            tv.tv_usec = 0;
            /* 开始等待 */
            retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
        if (retval == -1)
        {
         printf("将退出,select出错! %s", strerror(errno));
                break;
        }
        else
        if (retval == 0)
                {
                /* printf
                   ("没有任何消息到来,用户也没有按键,继续等待……\n"); */
                continue;
               }
            else
           {

                if (FD_ISSET(0, &rfds))
            {
                        /* 用户按键了,则读取用户输入的内容发送出去 */
                   bzero(sendbuf, MAXBUF);
               fgets(sendbuf, MAXBUF, stdin);  
              if (!strncasecmp(sendbuf, "quit", 4))
               {
                  printf("自己请求终止聊天!\n");
                  break;
                           }
                        }
            len = send(new_server_socket,sendbuf,strlen(sendbuf)-1,0);
             if(len>0)
            {
                    printf("发送消息成功:'%s',共%d个字节的数据\n",sendbuf, len);
                    //bzero(sendbuf, MAXBUF + 1);
            }
            else
                {
            
                        break;
            }

          }
                             while (FD_ISSET(new_server_socket, &rfds))
                      {
                      bzero(revbuf, MAXBUF + 1);
                    len = recv(new_server_socket,revbuf, MAXBUF, 0);
                      if(len>0)
                    {
                    printf("接收消息成功:'%s',共%d个字节的数据\n",revbuf, len);
                    //bzero(revbuf, MAXBUF + 1);
                    }

                      }
                    
           }
                   close(new_server_socket);
}
void hk_socket()
{        
        
         socklen_t len_str;
     //   pthread_t child_thread;//定义子线程      
        int server_socket,connect_socket;
      int listen_port=7878;
        int len;
        
      int MAXBUF =1024;
        char buf[MAXBUF + 1];
      
        struct sockaddr_in server_Addr;
        struct sockaddr_in clicent_Addr;
        
                   //结构体定义        

        if((server_socket=socket(PF_INET,SOCK_STREAM,0))==-1)//建立套接口
              {
         printf("bad socket\n");
         exit(1);
          }
      bzero(&server_Addr,sizeof(server_Addr));
           server_Addr.sin_family=PF_INET;
        server_Addr.sin_port=htons(listen_port);
      server_Addr.sin_addr.s_addr = INADDR_ANY;
      if(bind(server_socket,(struct sockaddr *) &server_Addr,sizeof(struct sockaddr))==-1)//绑定地址和端口
         {
         printf("bad bind\n");
             exit(1);
        }
     if(listen(server_socket,5)==-1)//开始监听;
       {
    printf("listen error");
    }    
         else
        {
           printf("HK start listen.......\n");
        }
    
         while(1)
         {    
            len_str=sizeof(struct sockaddr_in);
             connect_socket=accept(server_socket,(struct sockaddr *)&clicent_Addr,&len_str);
               if(connect_socket==-1)
                 {
            printf("connect error\n");
              }
            else
             {
            pthread_t child_thread;//定义
            int thread_id;
                thread_id=pthread_self();
                pthread_attr_t child_thread_attr;
                pthread_attr_init(&child_thread_attr);
                pthread_attr_setdetachstate(&child_thread_attr,PTHREAD_CREATE_DETACHED);
                if(thread_id=pthread_create(&child_thread,&child_thread_attr,for_clicent,(void *)connect_socket)!=0)
                        {
                   printf("pthread_create Failed : %s\n",strerror(errno));  
                        }  
             printf("server: got connection from %s, port %d, socket %d,thread %d\n", inet_ntoa(clicent_Addr.sin_addr),ntohs(clicent_Addr.sin_port),connect_socket,pthread_self());
                         // sleep(5);      
     }
    }
}


如键盘输入12345 ,到sendbuf里面的就只有 345,客户端接受当然也只有345了。。。怎么回事呢?
快速回复
限100 字节
 
上一个 下一个