Chinaunix首页 | 论坛 | 博客
  • 博客访问: 848748
  • 博文数量: 290
  • 博客积分: 511
  • 博客等级: 下士
  • 技术积分: 1590
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-29 13:14
文章分类

全部博文(290)

文章存档

2018年(28)

2017年(19)

2016年(8)

2015年(1)

2014年(14)

2013年(12)

2012年(22)

2011年(186)

分类:

2011-06-11 16:29:40

原文地址:TCP程序设计 作者:luozhiyong131

  1. Server:

  2. #include <stdlib.h>

  3. #include <stdio.h>

  4. #include <errno.h>

  5. #include <string.h>

  6. #include <netdb.h>

  7. #include <sys/types.h>

  8. #include <netinet/in.h>

  9. #include <sys/socket.h>



  10. #define portnumber 3333



  11. int main(int argc, char *argv[])

  12. {

  13.        int sockfd,new_fd;

  14.        struct sockaddr_in server_addr;

  15.        struct sockaddr_in client_addr;

  16.        int sin_size;

  17.        int nbytes;

  18.        char buffer[1024];



  19.        /* 服务器端开始建立sockfd描述符 */

  20.        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:IPV4;SOCK_STREAM:TCP


  21.        {

  22.               fprintf(stderr,"Socket error:%s\n\a",strerror(errno));

  23.               exit(1);

  24.        }



  25.        /* 服务器端填充 sockaddr结构 */

  26.        bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0


  27.        server_addr.sin_family=AF_INET; // Internet


  28.        server_addr.sin_addr.s_addr=htonl(INADDR_ANY); // (将本机器上的long数据转化为网络上的long数据)服务器程序能运行在任何ip的主机上 //INADDR_ANY 表示主机可以是任意IP地址,即服务器程序可以绑定到所有的IP上


  29.        //server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip


  30.        server_addr.sin_port=htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号


  31.        

  32.        /* 捆绑sockfd描述符到IP地址 */

  33.        if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

  34.        {

  35.               fprintf(stderr,"Bind error:%s\n\a",strerror(errno));

  36.               exit(1);

  37.        }



  38.        /* 设置允许连接的最大客户端数 */

  39.        if(listen(sockfd,5)==-1)

  40.        {

  41.               fprintf(stderr,"Listen error:%s\n\a",strerror(errno));

  42.               exit(1);

  43.        }



  44.        while(1)

  45.        {

  46.               /* 服务器阻塞,直到客户程序建立连接 */

  47.               sin_size=sizeof(struct sockaddr_in);

  48.               if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)

  49.               {

  50.                      fprintf(stderr,"Accept error:%s\n\a",strerror(errno));

  51.                      exit(1);

  52.               }



  53.               fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); // 将网络地址转换成.字符串


  54.               if((nbytes=read(new_fd,buffer,1024))==-1)

  55.               {

  56.                      fprintf(stderr,"Read Error:%s\n",strerror(errno));

  57.                      exit(1);

  58.               }

  59.               buffer[nbytes]='\0';

  60.               printf("Server received %s\n",buffer);

  61.               /* 这个通讯已经结束 */

  62.               close(new_fd);

  63.               /* 循环下一个 */

  64.        }



  65.        /* 结束通讯 */

  66.        close(sockfd);

  67.        exit(0);

  68. }



  69. clinet:

  70. #include <stdlib.h>

  71. #include <stdio.h>

  72. #include <errno.h>

  73. #include <string.h>

  74. #include <netdb.h>

  75. #include <sys/types.h>

  76. #include <netinet/in.h>

  77. #include <sys/socket.h>



  78. #define portnumber 3333



  79. int main(int argc, char *argv[])

  80. {

  81.        int sockfd;

  82.        char buffer[1024];

  83.        struct sockaddr_in server_addr;

  84.        struct hostent *host;



  85.        if(argc!=2)

  86.        {

  87.               fprintf(stderr,"Usage:%s hostname \a\n",argv[0]);

  88.               exit(1);

  89.        }



  90.     /* 使用hostname查询host 名字 */

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

  92.        {

  93.               fprintf(stderr,"Gethostname error\n");

  94.               exit(1);

  95.        }



  96.        /* 客户程序开始建立 sockfd描述符 */

  97.        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:Internet;SOCK_STREAM:TCP


  98.        {

  99.               fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));

  100.               exit(1);

  101.        }



  102.        /* 客户程序填充服务端的资料 */

  103.        bzero(&server_addr,sizeof(server_addr)); // 初始化,置0


  104.        server_addr.sin_family=AF_INET; // IPV4


  105.        server_addr.sin_port=htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号


  106.        server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址


  107.        //server_addr.sin_addr.s_addr = INADDR_ANY; //127。0。0。1


  108.        /* 客户程序发起连接请求 */

  109.        if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

  110.        {

  111.               fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));

  112.               exit(1);

  113.        }



  114.        /* 连接成功了 */

  115.        printf("Please input char:\n");

  116.        

  117.        /* 发送数据 */

  118.        fgets(buffer,1024,stdin);

  119.        write(sockfd,buffer,strlen(buffer));

  120.        /* 结束通讯 */

  121.        close(sockfd);

  122.        exit(0);

  123. }
阅读(555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~