TCP连接诊断

来源:互联网 发布:著名搞笑网络歌曲 编辑:程序博客网 时间:2024/05/22 12:33
Client端:
  int main(int argc,char *argv[])   /*main 函数*/
  {
    ​ pthread_t SELECT;
    ​
    ​ if(pthread_create(&SELECT, NULL, process_info1, NULL) != 0)    /*起一个线程*/
    ​ {
    ​    ​  printf(" SELECT thread failed\n");
    ​    ​  exit(1);
    ​ }
    ​ while(1)
    ​ {
    ​
    ​ }
}

void * process_info1(void *arg)    /*线程处理的函数*/
{
    ​ struct sockaddr_in addr_serv; //服务器端地址
    ​ struct sockaddr_in  ss;
     memset(&ss, 0, sizeof(struct sockaddr_in));
    ​ socklen_t len = sizeof(struct sockaddr_in)
     ​char *p;
    ​  sock_fd = socket(AF_INET,SOCK_STREAM,0);  /*TCP SOCKET*/
    ​  if(sock_fd < 0)
    ​  {
    ​    ​  perror("sock");
    ​    ​  exit(1);
    ​   } 
    ​   ​else 
       {
           printf("sock sucessful:\n");
        }
          memset(&addr_serv,0,sizeof(addr_serv));
 
          addr_serv.sin_family = AF_INET;
          addr_serv.sin_port =  htons(DEST_PORT);
          addr_serv.sin_addr.s_addr = inet_addr(DEST_IP_ADDRESS);
 
        if( connect(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr)) < 0) /*连接*/
    ​    ​{
                  perror("connect");
                  printf("connect (%d)\n",errno);
                  exit(1);
         } else {
                  printf("connect sucessful\n");
         }

    ​ if(getsockname(sock_fd, (struct sockaddr *)&ss, &len)<0)
    ​ {
    ​  exit(1);
    ​ }
    ​ p=inet_ntoa(*(struct in_addr *)&ss.sin_addr.s_addr);
    ​        printf("Ip is:%s\n",p);

    ​ int recv_num;
    ​ char recv_buf[50];
    ​
    ​ fd_set fds; 
    ​ struct timeval timeout={3,0}; //select等待3秒,3秒轮询,要非阻塞就置0 
    ​ char buffer[256]={0}; //256字节的接收缓冲区 

    ​ while(1) /*循环收包*/
    ​ { 
    ​    ​  FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
    ​    ​  FD_SET(sock_fd,&fds); //添加描述符 
    ​
    ​  switch(select(sock_fd+1,&fds,NULL,NULL,&timeout))   //select使用 
    ​  { 
    ​    ​  case -1: 
    ​    ​  exit(1);
    ​    ​  break; //select错误,退出程序 
    ​    ​
    ​    ​  case 0:
    ​    ​  break; //再次轮询
    ​    ​
    ​    ​  default: 
    ​    ​    ​  if(FD_ISSET(sock_fd,&fds)) //测试sock是否可读,即是否网络上有数据
    ​    ​    ​  { 
    ​    ​    ​  recv_num = recv(sock_fd,recv_buf,sizeof(recv_buf),0); 
    ​    ​    ​  if(recv_num < 0)
    ​    ​    ​  {
    ​    ​    ​  perror("recv");
    ​    ​    ​  printf("recv_num < 0\n");
    ​    ​    ​   exit(1);
    ​    ​    ​  } 
    ​    ​    ​  else 
    ​    ​    ​  {
    ​    ​    ​       recv_buf[recv_num]='\0';
    ​    ​    ​       printf("recv sucess:%s\n",recv_buf);
    ​    ​    ​  }
    ​  }// end if break; 
    ​   }// end switch 
    ​ }//end while 
}

server端:
 void process_info(int s)
  {
          int recv_num;
          int send_num;
          char recv_buf[50];
          char send_buf[50] ="hello world";

 int i=0;
 
          while(i<10){
                  printf("begin send\n");
                  send_num = send(s,send_buf,sizeof(send_buf),0);
                  if (send_num < 0){
                          perror("sned");
                          exit(1);
                  } else {
                          printf("send sucess\n");
                  }
i++;   
          }
exit(0);
  }
  int main()
  {
          int sock_fd,conn_fd;
          int client_len;
          pid_t pid;
          struct sockaddr_in addr_serv,addr_client;
          sock_fd = socket(AF_INET,SOCK_STREAM,0);
          if(sock_fd < 0){
                  perror("socket");
                  exit(1);
          } else {
                  printf("sock sucessful\n");
          }
          //初始化服务器端地址
          memset(&addr_serv,0,sizeof(addr_serv));
          addr_serv.sin_family = AF_INET;
          addr_serv.sin_port = htons(SOURCE_PORT);
          addr_serv.sin_addr.s_addr =inet_addr(SOURCE_IP_ADDRESS);
          client_len = sizeof(struct sockaddr_in);
          if(bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in))<0){
                  perror("bind");
                  exit(1);
          } else {
                  printf("bind sucess\n");
          }
          if (listen(sock_fd,QUEUE_LINE) < 0){
                  perror("listen");
                  exit(1);
          } else {
                  printf("listen sucessful\n");
          }
          while(1){
                   printf("begin accept:\n");
                   conn_fd = accept(sock_fd,(struct sockaddr *)&addr_client,&client_len);
                   if(conn_fd < 0){
                          perror("accept");
                          exit(1);
                   }
                   printf("accept a new client,ip:%s\n",inet_ntoa(addr_client.sin_addr));
                   pid = fork();
                   if(0 == pid){         //子进程
                          close(sock_fd);//在子进程中关闭服务器的侦听
                          process_info(conn_fd);//处理信息
                   } else {
                          close(conn_fd);//在父进程中关闭客户端的连接
                   }
          }
  }
0 0
原创粉丝点击