linux socket编程一般模式

1:所需头文件:<systypes.h>(数据类型定义,C语言的一些宏)  < sys/socket.h>(提供socket函数和数据结构)

    <netinet/in.h>(定义数据结构sockaddr_in) <netdb.h>(提供获取域名或IP的函数) 

    <arpa/inet.h>(提供IP地址转换函数)  <sys/select.h> (提供select函数集相关数据结构的)

2:编写客户端程序

      int sock_fd, recvbytes;

  char buf[MAXDATASIZE];   // 接受的数据存放的位置

  struct hostent *host;

   struct sockaddr_in serv_addr

     

      if((host=gethostbyname (argv[1]))==NULL)

     {

           herror("gethostbyname 出错! ");

           exit(1);

     }

  if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

    {

        perror("socket 创建出错! ");

        exit(1);

    }

   

serv_addr.sin_family=AF_INET;

  serv_addr.sin_port=htons(SERVPORT);

  serv_addr.sin_addr = *((struct in_addr *)host->h_addr);

  bzero(&(serv_addr.sin_zero),8);

  if (connect (sock_fd, (struct sockaddr *)&serv_addr, /

   sizeof(struct sockaddr)) == -1) {

         perror("connect 出错! ");

         exit(1);

      }

  if ((recvbytes=recv(sock_fd, buf, MAXDATASIZE, 0)) ==-1) {

     perror("recv 出错! ");

      exit(1);

     }

  buf[recvbytes] = '/0';

  printf("Received: %s",buf);

  close(sock_fd);

}

int sock_fd,client_fd;    /*sock_fd :监听 socket client_fd :数据传输 socket */

  struct sockaddr_in my_addr; /* 本机地址信息 */

  struct sockaddr_in remote_addr; /* 客户端地址信息 */

  if ((sock_fd = 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 = INADDR_ANY;  // 自动获取本机 IP 地址

  bzero(&(my_addr.sin_zero),8);            // 填充 0

  if (bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {

    perror("bind 出错! ");

    exit(1);

  }

  if (listen(sock_fd, BACKLOG) == -1) {   // 该函数使得 socket 处于被动监听状态

    perror("listen 出错! ");

    exit(1);

  }

  while(1) {

   sin_size = sizeof(struct sockaddr_in);

   if ((client_fd = accept(sock_fd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {

      perror("accept 出错 ");

      continue;

    }

   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);

   }

  }

 

    return 0;

}

 

 

服务器端的代码如下:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值