Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247664
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: LINUX

2017-11-12 11:00:23

==========================服务端代码===========================================

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <strings.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>

  8. #define PORT 1234 //端口号
  9. #define BACKLOG 1 //请求队列中的最大连接数

  10. int main()
  11. {
  12.     int listenfd, connectfd; //监听套接字描述符与连接套接字描述符
  13.     struct sockaddr_in server, client; //服务器端和客户端IPV4地址信息
  14.     socklen_t addrlen;
  15.     
  16.     //使用socket()函数,产生TCP套接字
  17.     if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  18.     {
  19.         perror("socket() error.");
  20.         exit(1);
  21.     }

  22.     int opt = 1;
  23.     //设置套接字选项,使用SO_REUSEADDR允许套接口和一个已经在使用中的地址绑定
  24.     setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  25.     //初始化server套接字地址结构
  26.     bzero(&server, sizeof(server));
  27.     server.sin_family = AF_INET;
  28.     server.sin_port = htons(PORT);
  29.     server.sin_addr.s_addr = htonl(INADDR_ANY);
  30.     
  31.     //使用bind()函数,将套接字与指定的协议地址绑定
  32.     if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1)
  33.     {
  34.         perror("Bind() error");
  35.         exit(1);
  36.     }
  37.     
  38.     //使用listen()函数,等待客户端的连接
  39.     if(listen(listenfd, BACKLOG) == -1)
  40.     {
  41.         perror("listen() error.\n");
  42.         exit(1);
  43.     }

  44.     addrlen = sizeof(client);
  45.     

  46.     //不断监听客户端的请求
  47.     while(1)
  48.     {
  49.         //接受客户端的连接,客户端的地址信息放在client地址结构中
  50.         if((connectfd = accept(listenfd, (struct sockaddr *)&client, &addrlen)) == -1)
  51.         {
  52.             perror("accept() error\n");
  53.             exit(1);
  54.         }
  55.         printf("You got a connection from client's IP is %s, port is %d\n",
  56.                 inet_ntoa(client.sin_addr), ntohs(client.sin_port));
  57.         //服务器端对连接的客户端发送一条信息
  58.         send(connectfd, "Welcome\n", 8, 0);
  59.         //关闭与客户端的连接
  60.         close(connectfd);
  61.     }

  62.     close(listenfd);
  63.     return 0;
  64. }


==========================客户端代码===========================================

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <netdb.h>
  8.  
  9. #define PORT 1234
  10.  
  11. #define MAXDATASIZE 100 //数据缓冲区最大长度
  12.  
  13. int main(int argc, char *argv[])
  14. {
  15.     int sockfd, num;
  16.     //数据缓冲区
  17.     char buf[MAXDATASIZE];
  18.     struct hostent *he;
  19.     //服务器IPv4地址信息
  20.     struct sockaddr_in server;
  21.  
  22.     if(argc != 2)
  23.     {
  24.         printf("Usage: %s \n", argv[0]);
  25.         exit(1);
  26.     }
  27.  
  28.     //通过gethostbyname()得到服务端的主机信息
  29.     if((he = gethostbyname(argv[1])) == NULL)
  30.     {
  31.         printf("gethostbyname() error\n");
  32.         exit(1);
  33.     }
  34.  
  35.     //使用socket()创建套接字
  36.     if((sockfd= socket(AF_INET, SOCK_STREAM, 0)) == -1)
  37.     {
  38.         printf("socket() error\n");
  39.         exit(1);
  40.     }
  41.  
  42.     //初始化server地址信息
  43.     bzero(&server, sizeof(server));
  44.     server.sin_family = AF_INET;
  45.     server.sin_port = htons(PORT);
  46.     server.sin_addr = *((struct in_addr *)he->h_addr);
  47.      
  48.     //使用connect()函数来配置套接字,建立一个与TCP服务器的连接
  49.     if(connect(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)
  50.     {
  51.         printf("connect() error\n");
  52.         exit(1);
  53.     }
  54.      
  55.     //使用recv()函数接收服务器发送的信息
  56.     if((num = recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
  57.     {
  58.         printf("recv() error\n");
  59.         exit(1);
  60.     }
  61.  
  62.     buf[num - 1] = '\0';
  63.     printf("server message: %s\n", buf);
  64.     //关闭连接
  65.     close(sockfd);
  66.     return 0;
  67. }



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