免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 898 | 回复: 0
打印 上一主题 下一主题

能用的socket 客户端 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-19 16:53 |只看该作者 |倒序浏览
重要参考:http://fanqiang.chinaunix.net/a4/b7/20010508/112052.html
如连校内: ./client www.xiaonei.com 80  ""
#includestdio.h>
#include stdlib.h>
#include errno.h>
#include string.h>
#include netdb.h>
#include sys/types.h>
#include netinet/in.h>
#include sys/socket.h>
#define SERVPORT 3333
#define MAXDATASIZE 1000 /*每次最大数据传输量 */
typedef    unsigned char        UINT8;
typedef    signed char          INT8;
typedef    unsigned short int   UINT16;
typedef    signed short int     INT16;
typedef    unsigned  int        UINT32;
typedef    signed int           INT32;
typedef   unsigned char               BOOLEAN;
typedef    unsigned short int    TC_OPCODE_T;
typedef struct
{
    UINT8        reserved1         : 7;  // Reserved
    UINT8        cmd_rsp_flag      : 1;  // Command/Response Flag  0 indicate command   1 response
    UINT8        seq_tag;                // Sequence Tag   // ensure the same command between request and response
    TC_OPCODE_T  opcode;                 // Opcode
    UINT8        client_tag;              // Reserved
    UINT8        no_rsp_reqd_flag  : 1;  // No Response Required Flag   0 expected response 1 no expected
    UINT8        reserved3         : 7;  // Reserved
    UINT16       reserved4;              // Reserved
    UINT32       length;                 // Data Length of Request
} TC_CMD_REQ_HDR_T;
typedef struct tc_tcmd
{
    TC_CMD_REQ_HDR_T cmd_header;     // TCMD command header
    //if will change the communication mode between APCP or APCP???
    int              cmd_sender;
    void *           cmd_pdata;      // TCMD cmd data
} TC_TCMD_T;
int main(int argc, char *argv[]){
      /*
          TC_CMD_REQ_HDR_T header;
          TC_CMD_REQ_HDR_T header1;
          TC_TCMD_T tcmd;
          TC_TCMD_T tcmd_one;
           TC_TCMD_T tcmd_two;
          TC_TCMD_T *ptcmd=&tcmd_two;
          int counter;
          char buffer[]="hello";
          char buffer_test[20];
          header.opcode=0x0039;
          header.length=0;         
          tcmd.cmd_header=header;
          tcmd.cmd_pdata=NULL;
          header1.opcode=0x0039;
          header1.length=strlen(buffer);      
          tcmd_one.cmd_header=header1;
      tcmd_one.cmd_pdata=buffer;
           printf( " tcmd_header length is %d\n ",sizeof(TC_CMD_REQ_HDR_T) );
          printf( " tcmd length is %d\n ",sizeof(tcmd) );
          printf( " tcmd_one length is %d\n ",sizeof(tcmd_one) );
          memcpy( buffer_test, &tcmd_one , sizeof(TC_CMD_REQ_HDR_T));
          memcpy( buffer_test+sizeof( TC_CMD_REQ_HDR_T),"hello" , 6 );
          memcpy( &(tcmd_two.cmd_header), buffer_test, sizeof(TC_CMD_REQ_HDR_T));
          //memcpy( &(tcmd_two.cmd_header), buffer_test, sizeof(TC_CMD_REQ_HDR_T));
         
          tcmd_two.cmd_pdata= buffer_test+ sizeof(TC_CMD_REQ_HDR_T);
          printf( "data: %s\n" ,ptcmd->cmd_pdata);
*/
//socket
    int sockfd, recvbytes;
    char buf[MAXDATASIZE];
    struct hostent *host;
    struct sockaddr_in serv_addr;
   
    char send_buf[200];
    snprintf(send_buf, 200 - 1,"GET /%s HTTP/1.1\r\nHOST:%s\r\nCONNECTION:CLOSE\r\n\r\n",argv[3], argv[1]);
    printf("send_buf:%s" , send_buf );
    if (argc  3) {
       fprintf(stderr,"Please enter the server's hostname and port!\n");
       exit(1);
    }
    if((host=gethostbyname(argv[1]))==NULL) {
      perror("gethostbyname出错!");
      exit(1);
    }
/*
if(inet_aton(argv[1],&serv_addr.sin_addr)!=0)
                {
                   host=gethostbyaddr((char   *)&serv_addr.sin_addr,4,AF_INET);
                   printf("Address information of Ip %s\n",argv[1]);
                }
*/
   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
      perror("socket创建出错!");
      exit(1);
   }
   serv_addr.sin_family=AF_INET;
   serv_addr.sin_port=htons(atoi(argv[2]));
   printf( "port:%d\n", atoi(argv[2]));
   serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
   //inet_aton(argv[1],&serv_addr.sin_addr);
  //serv_addr.sin_addr.s_addr = INADDR_ANY;
   printf("argv[1]%s\n" , argv[1]);
   printf( "inet_aton success!\n" );
   bzero( &(serv_addr.sin_zero),8);
   printf( "receiving....!\n" );
   if (connect(sockfd, (struct sockaddr *) &serv_addr, \
      sizeof(struct sockaddr)) == -1) {
      perror("connect出错!");
      exit(1);
   }
   printf( "receiving..hostname..%s!\n",host->h_name );
   printf( " serv_addrlength is %d ",sizeof(serv_addr) );
  if (send(sockfd, (void *)send_buf, 200 , 0) == -1){
       perror( "send出错!");
       close(sockfd);
       exit(0);
      }

    printf( "received...\n" );
while(1)
   {
     if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) {
      
      perror("recv出错!");
      exit(1);
     }
     if( recvbytes==0 ){break;};
       buf[recvbytes] = '\0';
       printf( "Received: %s",buf);
       break;
   }
   buf[recvbytes] = '\0';
   printf( "Received: %s",buf);  
   close(sockfd);
}
服务端:
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 3333 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
int main()
{
  int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
  int  sin_size;
  struct sockaddr_in my_addr; /* 本机地址信息 */
  struct sockaddr_in remote_addr; /* 客户端地址信息 */
  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
     perror( "socket创建出错!"); exit(1);
  }
  my_addr.sin_family=AF_INET;
  my_addr.sin_port=htons(SERVPORT);
  my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  bzero( &(my_addr.sin_zero),8);
  if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) {
   perror( "bind出错!");
   exit(1);
  }
  if (listen(sockfd, BACKLOG) == -1) {
    perror( "listen出错!");
   exit(1);
  }
//printf( "server address %s\n", inet_ntoa(my_addr.sin_addr));
  while(1) {
    sin_size = sizeof(struct sockaddr_in);
    printf( "begin accept:\n" );
    if ((client_fd = accept(sockfd, (struct sockaddr *) &remote_addr, &sin_size)) == -1) {
       perror( "accept出错");
       continue;
    }
    printf( "end accept:" );
    printf( "received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
    if (!fork()) { /* 子进程代码段 */
      if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1){
       perror( "send出错!");
       close(client_fd);
       exit(0);
      }
     close(client_fd);
    }
  }
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/63775/showart_1210693.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP