posts - 108,comments - 56,trackbacks - 0
          #include   <sys/stat.h>   
          #include   
          <sys/types.h>   
          #include   
          <sys/socket.h>   
          #include   
          <stdio.h>   
          #include   
          <malloc.h>   
          #include   
          <netdb.h>   
          #include   
          <fcntl.h>
          #include   
          <unistd.h>
          #include   
          <netinet/in.h>
          #include   
          <arpa/inet.h>

          #define    RES_LENGTH  10240 //接受字符的最大長度

          int     connect_socket(char * server,int serverPort);
          int     send_msg(int sockfd,char * sendBuff);
          char *  recv_msg(int sockfd);
          int     close_socket(int sockfd);

          int main(int argc,char ** argv)
          {
              
          int    sockfd=0;
              
          char     sendMsg[30]="abc.org\r\n\r";
              
          char    * res;
              sockfd
          =connect_socket("whois.pir.org",43);
              send_msg(sockfd,sendMsg);
              res
          =recv_msg(sockfd);
              printf(res);
              free(res);
              close_socket(sockfd);
              
          return 0;
          }
          /************************************************************
           * 連接SOCKET服務器,如果出錯返回-1,否則返回socket處理代碼
           * server:服務器地址(域名或者IP),serverport:端口
           * *******************************************************
          */
          int    connect_socket(char * server,int serverPort){
              
          int    sockfd=0;
              
          struct    sockaddr_in    addr;
              
          struct    hostent        * phost;
              
          //向系統注冊,通知系統建立一個通信端口
              
          //AF_INET表示使用IPv4協議
              
          //SOCK_STREAM表示使用TCP協議
              if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
                  herror(
          "Init socket error!");
                  
          return -1;
              }

              bzero(
          &addr,sizeof(addr));
              addr.sin_family
          =AF_INET;
              addr.sin_port
          =htons(serverPort);
              addr.sin_addr.s_addr
          =inet_addr(server);//按IP初始化
              if(addr.sin_addr.s_addr == INADDR_NONE){//如果輸入的是域名
                  phost = (struct hostent*)gethostbyname(server);
                  
          if(phost==NULL){
                      herror(
          "Init socket s_addr error!");
                      
          return -1;
                  }
                  addr.sin_addr.s_addr 
          =((struct in_addr*)phost->h_addr)->s_addr;
              }
              
          if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr))<0)
                  
          return -1;//0表示成功,-1表示失敗
              else
                  
          return sockfd;

          }

          /**************************************************************
           * 發送消息,如果出錯返回-1,否則返回發送的字符長度
           * sockfd:socket標識,sendBuff:發送的字符串
           * ********************************************************
          */
          int    send_msg(int sockfd,char * sendBuff){
              
          int    sendSize=0;
              
          if((sendSize=send(sockfd,sendBuff,strlen(sendBuff),0))<=0){
                  herror(
          "Send msg error!");
                  
          return -1;
              }
          else
                  
          return sendSize;
          }

          /****************************************************************
           *接受消息,如果出錯返回NULL,否則返回接受字符串的指針(動態分配,注意釋放)
           *sockfd:socket標識
           * ********************************************************
          */
          char *    recv_msg(int sockfd){
              
          char * response;
              
          int  flag=0,recLenth=0;
              response
          =(char *)malloc(RES_LENGTH);
              memset(response,
          0,RES_LENGTH);
              
          for(flag=0;;){
                  
          if((recLenth=recv(sockfd,response+flag,RES_LENGTH-flag,0))==-1){
                      free(response);
                      herror(
          "Recv msg error!");
                      
          return NULL;
                  }
          else if(recLenth==0)
                      
          break;
                  
          else{
                      flag
          +=recLenth;
                      recLenth
          =0;
                  }
              }
              response[flag]
          ='\0';
              
          return response;
          }
          /**************************************************
           *關閉連接
           * *********************************************
          */
          int    close_socket(int sockfd){
              close(sockfd);
              
          return 0;
          }
          posted on 2007-12-17 11:14 破繭而出 閱讀(6533) 評論(2)  編輯  收藏 所屬分類: C/C++

          FeedBack:
          # re: Socket客戶端例子[C語言]
          2008-03-26 16:00 | wangfeizjk
          為什么我用你這個客戶端接收的時候會報錯啊。這個錯誤是為什么Recv msg error! : Resolver Error 0 (no error)
            回復  更多評論
            
          # re: Socket客戶端例子[C語言]
          2011-11-10 10:58 | Norz
          @wangfeizjk
          你是在windows下吧?
          win下創建socket需要先初始化WSADATA  回復  更多評論
            
          主站蜘蛛池模板: 石台县| 通辽市| 繁峙县| 龙岩市| 广宗县| 望江县| 临邑县| 金门县| 通城县| 鹤壁市| 许昌市| 九江市| 绥中县| 额敏县| 宣恩县| 房山区| 吴川市| 高尔夫| 鲁山县| 六枝特区| 瑞金市| 田林县| 吴忠市| 温州市| 上林县| 大连市| 平阳县| 桐庐县| 剑阁县| 凤冈县| 定襄县| 清水河县| 长泰县| 义乌市| 金华市| 长丰县| 抚松县| 库尔勒市| 东乡族自治县| 邯郸市| 丁青县|