如何开发网络通信应用程序

解决方案 »

  1.   

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)/*创建TCP协议的字节流*/
     {
      fprintf(stderr, "Socket failed !!\n");
      return(-1);
     }
     bzero((char *)&serv_addr, sizeof(serv_addr));/*服务器地址清0*/
     serv_addr.sin_family  = AF_INET;/*网络类型使用ARPA internet地址*/
     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
     /*IP地址取公认的任意合法地址*/
     serv_addr.sin_port = htons(1234);
     /*设定IP端口号, 并将主机字节顺序转换为网络字节顺序*/ if ( bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 )/*将服务器地址信息捆绑到创建的套接字上*/
     {
      fprintf(stderr, "Bind failed !!\n");
      return(-1);
     } if ( listen(sockfd, 5) < 0 )/*建立长度为5的监听队列从套接字上收听连接请求*/
     {
      fprintf(stderr, "Listen failed !!\n");
      return(-1);
     }
     fprintf(stderr, "blocked here.....\n"); clilen = sizeof(cli_addr);
     /*阻塞至客户方有连接请求到来*/
     newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
     /*有连接请求时, 返回被赋予客户机地址的新套接字, 连接已建立*/fprintf(stderr, "connected now!!!\n");
     if ( newsockfd < 0 )
     {
      fprintf(stderr, "Accept failed!!\n");
      return(-1);
     }
     shutdown(sockfd, 2);
     close(sockfd);
     memset(info,0,sizeof(info));
        infolen=6;
        if ((rc=TCPRECEIVE(newsockfd, info, infolen)) == -1)/*接受客户机发来的信息*/
         fprintf(stderr, "TCPRecv failed !!\n"); if (!memcmp(info,"123456",6))
     {/*返回帐号为123456的帐户信息*/
         printf("received account no is  %6.6s\n",info);
      sprintf(info,"%6.6s|%8.8s|%10.2lf",info,"zhang li",123.456);
     }
     else{/*否则, 返回000000表示无此帐户*/
      printf("no such account no  %6.6s\n",info);
      sprintf(info,"%6.6s|%8.8s|%lf","000000","",0.0);
     }
     
        infolen=sizeof(info);
        if ((rc=TCPSEND(newsockfd, info, infolen) )== -1) /*向客户机发送该帐户信息*/
         fprintf(stderr, "TCPSend failed !!\n"); shutdown(newsockfd, 2);
     close(newsockfd);}
    /*客户端程序:hxclient.c*/
    #include 
    #include 
    #include 
    #include 
    #include "tcpipop.c" typedef struct{
    char accno[7];
    char name[9];
    double  amt;
    } data_type;
    /* 帐户数据结构 */main(argc,argv)int argc;
    char ** argv;
    {
        int i=0;
        int sockfd;
        struct sockaddr_in  serv_addr;/*存服务器方的地址*/
     char info[100];
     int infolen;
     data_type data;
     int rc; if (argc!=2)
     {
      fprintf(stderr,"client ipaddress\n");
      exit(-1);
     }
     /*参数是服务器的IP地址*/    for ( ; i<10; i++ )/*最多连接10次*/
        {
     bzero((char *)&serv_addr, sizeof(serv_addr));
     /*服务器地址变量清0*/ serv_addr.sin_family  = AF_INET;
     /*网络地址类型使用ARPA internet 地址*/
     serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
     /*服务器IP地址转换为长整型IP地址, 并赋予地址结构变量*/serv_addr.sin_port=htons(1234);
     /*与服务器相同的IP端口号, 经主机字节顺序到网络字节顺序的转换*/
     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
     /*创建TCP协议的字节流套接字*/
     {
      fprintf(stderr, "Client : Can not open stream socket\n");
      shutdown(sockfd, 2);
      close(sockfd);
      return(-1);
     }
     if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) >= 0)
     /*与服务进程建立连接*/
      break;
     shutdown(sockfd, 2);
     close(sockfd);
        }    if ( i >= 10 )
            exit(-1);
        /*此时连接已建立, 可通过对套接字的读写实现通信*/memset(&data,0,sizeof(data));
     printf("enter account no:");
     scanf("%s",data.accno); /*输入要检索的帐号*/ infolen=sizeof(data.accno);
     bcopy(&data.accno,info,infolen);
        if ( (rc=TCPSEND(sockfd, info, infolen)) == -1 )
         fprintf(stderr, "TCPSend failed !!\n");
        /*客户进程向服务进程发送帐号信息*/
     infolen=sizeof(info);
        if ( (rc=TCPRECEIVE(sockfd, info, infolen)) == -1 ) 
         fprintf(stderr, "TCPRecv failed !!\n");
        /*客户进程接收服务进程返回的帐户信息*/ sscanf(info,"%[^|]|%[^|]|%lf",data.accno,data.name,&data.amt); /*格式转换*/if (!memcmp(data.accno,"000000",6))/*判断是否查到*/
      printf("There is no such account in server database.\n");
     else {/*显示帐户信息*/
         printf("accno  is %s\n",data.accno);
         printf("name   is %s\n",data.name);
         printf("amount is %-10.2lf\n",data.amt);
     }
     
     shutdown(sockfd, 2);
     close(sockfd);
    }/*公共程序:tcpipop.c*/
    /*
    *  Using  TCP/IP  Protocol.
    */#include 
    #include 
    #include 
    #include 
    #include extern int TCPSEND(int fd, char *buf, int len)
    {
     int i=0;
       int send_rc; for ( ; i<10; i++ ) {send_rc = write( fd, buf, len );
      if ( send_rc == len )
       break;
      sleep(1);
     } if ( i >= 10 )
      return(-1);
     else
      return(send_rc);
    }
    extern int TCPRECEIVE(int fd, char *buf, int len)
    {
     int i=0;
     int receive_rc; for ( ; i<10; i++ ) {    receive_rc = read(fd, buf, len);  if ( receive_rc == len )
       break;
      sleep(1);
     } if ( i >= 10 )
      return(-1);
     else
      return(receive_rc);
    }
      

  2.   

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)/*创建TCP协议的字节流*/
     {
      fprintf(stderr, "Socket failed !!\n");
      return(-1);
     }
     bzero((char *)&serv_addr, sizeof(serv_addr));/*服务器地址清0*/
     serv_addr.sin_family  = AF_INET;/*网络类型使用ARPA internet地址*/
     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
     /*IP地址取公认的任意合法地址*/
     serv_addr.sin_port = htons(1234);
     /*设定IP端口号, 并将主机字节顺序转换为网络字节顺序*/ if ( bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 )/*将服务器地址信息捆绑到创建的套接字上*/
     {
      fprintf(stderr, "Bind failed !!\n");
      return(-1);
     } if ( listen(sockfd, 5) < 0 )/*建立长度为5的监听队列从套接字上收听连接请求*/
     {
      fprintf(stderr, "Listen failed !!\n");
      return(-1);
     }
     fprintf(stderr, "blocked here.....\n"); clilen = sizeof(cli_addr);
     /*阻塞至客户方有连接请求到来*/
     newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
     /*有连接请求时, 返回被赋予客户机地址的新套接字, 连接已建立*/fprintf(stderr, "connected now!!!\n");
     if ( newsockfd < 0 )
     {
      fprintf(stderr, "Accept failed!!\n");
      return(-1);
     }
     shutdown(sockfd, 2);
     close(sockfd);
     memset(info,0,sizeof(info));
        infolen=6;
        if ((rc=TCPRECEIVE(newsockfd, info, infolen)) == -1)/*接受客户机发来的信息*/
         fprintf(stderr, "TCPRecv failed !!\n"); if (!memcmp(info,"123456",6))
     {/*返回帐号为123456的帐户信息*/
         printf("received account no is  %6.6s\n",info);
      sprintf(info,"%6.6s|%8.8s|%10.2lf",info,"zhang li",123.456);
     }
     else{/*否则, 返回000000表示无此帐户*/
      printf("no such account no  %6.6s\n",info);
      sprintf(info,"%6.6s|%8.8s|%lf","000000","",0.0);
     }
     
        infolen=sizeof(info);
        if ((rc=TCPSEND(newsockfd, info, infolen) )== -1) /*向客户机发送该帐户信息*/
         fprintf(stderr, "TCPSend failed !!\n"); shutdown(newsockfd, 2);
     close(newsockfd);}
    /*客户端程序:hxclient.c*/
    #include 
    #include 
    #include 
    #include 
    #include "tcpipop.c" typedef struct{
    char accno[7];
    char name[9];
    double  amt;
    } data_type;
    /* 帐户数据结构 */main(argc,argv)int argc;
    char ** argv;
    {
        int i=0;
        int sockfd;
        struct sockaddr_in  serv_addr;/*存服务器方的地址*/
     char info[100];
     int infolen;
     data_type data;
     int rc; if (argc!=2)
     {
      fprintf(stderr,"client ipaddress\n");
      exit(-1);
     }
     /*参数是服务器的IP地址*/    for ( ; i<10; i++ )/*最多连接10次*/
        {
     bzero((char *)&serv_addr, sizeof(serv_addr));
     /*服务器地址变量清0*/ serv_addr.sin_family  = AF_INET;
     /*网络地址类型使用ARPA internet 地址*/
     serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
     /*服务器IP地址转换为长整型IP地址, 并赋予地址结构变量*/serv_addr.sin_port=htons(1234);
     /*与服务器相同的IP端口号, 经主机字节顺序到网络字节顺序的转换*/
     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
     /*创建TCP协议的字节流套接字*/
     {
      fprintf(stderr, "Client : Can not open stream socket\n");
      shutdown(sockfd, 2);
      close(sockfd);
      return(-1);
     }
     if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) >= 0)
     /*与服务进程建立连接*/
      break;
     shutdown(sockfd, 2);
     close(sockfd);
        }    if ( i >= 10 )
            exit(-1);
        /*此时连接已建立, 可通过对套接字的读写实现通信*/memset(&data,0,sizeof(data));
     printf("enter account no:");
     scanf("%s",data.accno); /*输入要检索的帐号*/ infolen=sizeof(data.accno);
     bcopy(&data.accno,info,infolen);
        if ( (rc=TCPSEND(sockfd, info, infolen)) == -1 )
         fprintf(stderr, "TCPSend failed !!\n");
        /*客户进程向服务进程发送帐号信息*/
     infolen=sizeof(info);
        if ( (rc=TCPRECEIVE(sockfd, info, infolen)) == -1 ) 
         fprintf(stderr, "TCPRecv failed !!\n");
        /*客户进程接收服务进程返回的帐户信息*/ sscanf(info,"%[^|]|%[^|]|%lf",data.accno,data.name,&data.amt); /*格式转换*/if (!memcmp(data.accno,"000000",6))/*判断是否查到*/
      printf("There is no such account in server database.\n");
     else {/*显示帐户信息*/
         printf("accno  is %s\n",data.accno);
         printf("name   is %s\n",data.name);
         printf("amount is %-10.2lf\n",data.amt);
     }
     
     shutdown(sockfd, 2);
     close(sockfd);
    }/*公共程序:tcpipop.c*/
    /*
    *  Using  TCP/IP  Protocol.
    */#include 
    #include 
    #include 
    #include 
    #include extern int TCPSEND(int fd, char *buf, int len)
    {
     int i=0;
       int send_rc; for ( ; i<10; i++ ) {send_rc = write( fd, buf, len );
      if ( send_rc == len )
       break;
      sleep(1);
     } if ( i >= 10 )
      return(-1);
     else
      return(send_rc);
    }
    extern int TCPRECEIVE(int fd, char *buf, int len)
    {
     int i=0;
     int receive_rc; for ( ; i<10; i++ ) {    receive_rc = read(fd, buf, len);  if ( receive_rc == len )
       break;
      sleep(1);
     } if ( i >= 10 )
      return(-1);
     else
      return(receive_rc);
    }
      

  3.   


      fprintf(stderr, "Accept failed!!\n");
      return(-1);
     }
     shutdown(sockfd, 2);
     close(sockfd);
     memset(info,0,sizeof(info));
        infolen=6;
        if ((rc=TCPRECEIVE(newsockfd, info, infolen)) == -1)/*接受客户机发来的信息*/
         fprintf(stderr, "TCPRecv failed !!\n"); if (!memcmp(info,"123456",6))
     {/*返回帐号为123456的帐户信息*/
         printf("received account no is  %6.6s\n",info);
      sprintf(info,"%6.6s|%8.8s|%10.2lf",info,"zhang li",123.456);
     }
     else{/*否则, 返回000000表示无此帐户*/
      printf("no such account no  %6.6s\n",info);
      sprintf(info,"%6.6s|%8.8s|%lf","000000","",0.0);
     }
     
        infolen=sizeof(info);
        if ((rc=TCPSEND(newsockfd, info, infolen) )== -1) /*向客户机发送该帐户信息*/
         fprintf(stderr, "TCPSend failed !!\n"); shutdown(newsockfd, 2);
     close(newsockfd);}
    /*客户端程序:hxclient.c*/
    #include 
    #include 
    #include 
    #include 
    #include "tcpipop.c" typedef struct{
    char accno[7];
    char name[9];
    double  amt;
    } data_type;
    /* 帐户数据结构 */main(argc,argv)int argc;
    char ** argv;
    {
        int i=0;
        int sockfd;
        struct sockaddr_in  serv_addr;/*存服务器方的地址*/
     char info[100];
     int infolen;
     data_type data;
     int rc; if (argc!=2)
     {
      fprintf(stderr,"client ipaddress\n");
      exit(-1);
     }
     /*参数是服务器的IP地址*/    for ( ; i<10; i++ )/*最多连接10次*/
        {
     bzero((char *)&serv_addr, sizeof(serv_addr));
     /*服务器地址变量清0*/ serv_addr.sin_family  = AF_INET;
     /*网络地址类型使用ARPA internet 地址*/
     serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
     /*服务器IP地址转换为长整型IP地址, 并赋予地址结构变量*/