Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1218738
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: LINUX

2015-12-02 15:48:48

client.c文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <sys/wait.h>
  8. #include <pthread.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11. #include <unistd.h>
  12. #include <sys/stat.h>
  13. #include <fcntl.h>
  14. #include <errno.h>
  15. #include <termios.h>
  16. #include <sys/time.h>
  17. #include <sys/timeb.h>
  18. #include <stdarg.h>

  19. #define SER_IP "127.0.0.1" /*服务器的IP地址*/

  20. int read_socket(int socket_id, char *pbuf, int len);
  21. int write_socket(int socket_id, char *pbuf, int len);

  22. int main(int argc, char ** argv) /*客户端程序*/
  23. {
  24.     FILE * fp = NULL;
  25.     char judg[32];
  26.     char total_buf[1024];;
  27.     int sockfd = -1;
  28.     int ret = -1;
  29.     int opt = 1;
  30.     int len1, len2;
  31.     struct sockaddr_in seraddr; /*用来存放要访问的服务器的IP地址和端口号*/
  32.     
  33.     memset(judg, 0, sizeof(judg));
  34.     memset(total_buf, 0, sizeof(total_buf));
  35.     memset(&seraddr, 0, sizeof(seraddr)); /*初始化*/
  36.     

  37.     sockfd = socket(AF_INET, SOCK_STREAM, 0); /*创建套接字文件,TCP协议*/
  38.     if(sockfd < 0)
  39.     {
  40.         return -1;
  41.     }
  42.     setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); /*将客户端设置具有端口号可以重复*/

  43.     seraddr.sin_family = AF_INET; /*服务器的地址族协议*/
  44.     seraddr.sin_port = htons(4989);     /*服务器的端口号*/
  45.     inet_pton(AF_INET, SER_IP, &seraddr.sin_addr.s_addr); /*服务器的ip地址*/
  46.                                                                                                             
  47.     ret = connect(sockfd, (struct sockaddr*)&seraddr, sizeof(seraddr)); /*请求连接服务器*/
  48.     if(ret < 0)
  49.     {
  50.         return -1;
  51.     }
  52.     
  53.     printf("客户端已请求连接!\n");
  54.     
  55.     ret = read_socket(sockfd, judg, sizeof(char)*2); /*对服务器是否准备好的判断*/
  56.     if (0 == ret) /*套接字关闭*/
  57.     {
  58.         return -1;
  59.     }
  60.     else if(ret < 0)
  61.     {
  62.         exit(0);
  63.     }
  64.     if (strncmp(judg, "OK", sizeof(char)*2) != 0) /*服务器OK*/
  65.     {
  66.         close(sockfd);
  67.         return -1;
  68.     }
  69.     printf("客户端接受数据:\n");
  70.     
  71.     ret = read(sockfd, total_buf, 10);
  72.     if (ret <= 0)
  73.     {
  74.         return(-1);
  75.     }
  76.     printf("total_buf=[%s]\n", total_buf);
  77.     return 0;
  78. }

  79. /***********************************************************
  80. * 函 数 名:read_socket
  81. * 功能描述: 读socket
  82. * 输入参数:
  83. * 输出参数:
  84. * 返 回:
  85. * 流程描述:
  86. * 说明:
  87. * 修改记录:
  88. * [修改人] [日期] - [描述]
  89. ***********************************************************/
  90. int read_socket(int socket_id, char *pbuf, int len){
  91.     int num;
  92.     int i;
  93.     
  94.     if(len <= 0) {
  95.         return     read(socket_id, pbuf, sizeof(pbuf));
  96.     }

  97.     i = 0;
  98.     do{
  99.         num = read(socket_id, &(pbuf[i]), len - i);
  100.         if (num <= 0){
  101.             /* LOG: Read socket error exit. */
  102.             return(-1);
  103.         }
  104.         i += num;
  105.     } while (i < len);

  106.     return(i);
  107. }

  108. /***********************************************************
  109. * 函 数 名:write_socket
  110. * 功能描述: 写socket
  111. * 输入参数:
  112. * 输出参数:
  113. * 返 回:
  114. * 流程描述:
  115. * 说明:
  116. * 修改记录:
  117. * [修改人] [日期] - [描述]
  118. ***********************************************************/
  119. int write_socket(int socket_id, char *pbuf, int len){
  120.     int num;
  121.     int i;

  122.     if (len <= 0) return(0);
  123.         
  124.     i = 0;
  125.     do{
  126.         num = write(socket_id, &(pbuf[i]), len - i);
  127.         if (num < 0){
  128.             /* LOG: Write socket error exit. */
  129.             return(-1);
  130.         }
  131.         i += num;
  132.     } while (i < len);
  133.     
  134.     return(i);
  135. }
server.c文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <sys/wait.h>
  8. #include <pthread.h>
  9. #include <stdlib.h>
  10. #include <time.h>
  11. #include <unistd.h>
  12. #include <sys/stat.h>
  13. #include <fcntl.h>
  14. #include <errno.h>
  15. #include <termios.h>
  16. #include <sys/time.h>
  17. #include <sys/timeb.h>
  18. #include <stdarg.h>

  19. #define SER_IP "127.0.0.1" /*服务器的IP地址*/

  20. int read_socket(int socket_id, char *pbuf, int len);
  21. int write_socket(int socket_id, char *pbuf, int len);

  22. int main(int argc, char ** argv) /*服务端程序*/
  23. {
  24.     char ip_buf[32];
  25.     int sockfd = -1; /*监听套接字*/
  26.     int newfd = -1; /*连接套接字*/
  27.     int ret = -1;
  28.     int opt = 1;
  29.     int len;
  30.     int i=0;
  31.     int read_count = 1; /*读取次数*/
  32.     struct sockaddr_in seraddr; /*用来保存服务器自己的ip地址和端口号的*/
  33.     struct sockaddr_in cliaddr; /*用来保存连接过来的客户的ip地址和端口号的*/
  34.     
  35.     memset(&seraddr, 0, sizeof(seraddr));
  36.     memset(&cliaddr, 0, sizeof(cliaddr));
  37.     
  38.     
  39.     sockfd = socket(AF_INET, SOCK_STREAM, 0); /*创建连接套接字,TCP协议*/
  40.     if(sockfd < 0)
  41.     {
  42.         return -1;
  43.     }
  44.     setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); /*将服务端设置具有端口号可以重复*/

  45.     seraddr.sin_family = AF_INET; /*指定服务器地址协议族*/
  46.     seraddr.sin_port = htons(4989);     /*指定要监听的服务器的端口号*/
  47.     seraddr.sin_addr.s_addr = INADDR_ANY; /*指定要监听的服务器的ip*/

  48.     ret = bind(sockfd, (struct sockaddr*)&seraddr, sizeof(struct sockaddr)); /*将IP地址,端口号和文件绑定,为套接字命名*/
  49.     if(ret < 0)
  50.     {
  51.         return -1;
  52.     }
  53.     ret = listen(sockfd, 10); /*监听*/
  54.     if(ret < 0)
  55.     {
  56.         return -1;
  57.     }
  58.     printf("等待客户端连接.....\n");
  59.     
  60.     len = sizeof(cliaddr); /*-结果参数*/
  61.     newfd = accept(sockfd, (struct sockaddr*)&cliaddr, &len); /*等着客户端连接*/
  62.     if(newfd < 0)
  63.     {
  64.         return -1;
  65.     }
  66.     inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ip_buf, sizeof(ip_buf)); /**/
  67.     printf("客户IP=[%s]", ip_buf);
  68.     ret = write_socket(newfd, "OKYES", sizeof("OKYES")); /*告诉客户端,服务器OK了*/
  69.     if(ret < 0)
  70.     {
  71.         return -1;
  72.     }
  73.     printf("客户端不发数据,执行while(1),循环等待\n");
  74.     while(1);

  75.     return 0;
  76. }


  77. /***********************************************************
  78. * 函 数 名:read_socket
  79. * 功能描述: 读socket
  80. * 输入参数:
  81. * 输出参数:
  82. * 返 回:
  83. * 流程描述:
  84. * 说明:
  85. * 修改记录:
  86. * [修改人] [日期] - [描述]
  87. ***********************************************************/
  88. int read_socket(int socket_id, char *pbuf, int len){
  89.     int num;
  90.     int i;
  91.     
  92.     if(len <= 0) {
  93.         return     read(socket_id, pbuf, sizeof(pbuf));
  94.     }

  95.     i = 0;
  96.     do{
  97.         num = read(socket_id, &(pbuf[i]), len - i);
  98.         if (num <= 0){
  99.             /* LOG: Read socket error exit. */
  100.             return(-1);
  101.         }
  102.         i += num;
  103.     } while (i < len);

  104.     return(i);
  105. }

  106. /***********************************************************
  107. * 函 数 名:write_socket
  108. * 功能描述: 写socket
  109. * 输入参数:
  110. * 输出参数:
  111. * 返 回:
  112. * 流程描述:
  113. * 说明:
  114. * 修改记录:
  115. * [修改人] [日期] - [描述]
  116. ***********************************************************/
  117. int write_socket(int socket_id, char *pbuf, int len){
  118.     int num;
  119.     int i;

  120.     if (len <= 0) return(0);
  121.         
  122.     i = 0;
  123.     do{
  124.         num = write(socket_id, &(pbuf[i]), len - i);
  125.         if (num < 0){
  126.             /* LOG: Write socket error exit. */
  127.             return(-1);
  128.         }
  129.         i += num;
  130.     } while (i < len);
  131.     
  132.     return(i);
  133. }

阅读(859) | 评论(0) | 转发(0) |
0

上一篇:select函数

下一篇:信号

给主人留下些什么吧!~~