使用之前的函数实现的简单聊天程序

TCP协议

双方实时发送/接收消息

实现后的问题:

  可能是我虚拟机的IP地址配得有问题吧。在一台电脑上面开两个终端,用127.0.0.1的IP收发可以互通。但是两个虚拟机就不行了,用192.168的IP段,能够ping通但是代码接收不到消息。

  还有,两个进程都是接收到消息后,需要我自己按一下回车才能发送消息。

服务器端代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<errno.h>
  4. #include<sys/socket.h>
  5. #include<resolv.h>
  6. #include<stdlib.h>
  7. #include<netinet/in.h>
  8. #include<arpa/inet.h>
  9. #include<unistd.h>
  10. #define MAXBUF 1024
  11. int main(int argc, char *argv[])
  12. {
  13. int pid;
  14. int sockfd, new_fd;
  15. socklen_t len;
  16. struct sockaddr_in my_addr, their_addr;
  17. unsigned int myport, lisnum;
  18. char buf[MAXBUF + ];
  19. if(argv[])
  20. myport = atoi(argv[]); //命令行字符串转为整数,端口
  21. else
  22. myport = ; //默认端口
  23.  
  24. if(argv[])
  25. lisnum = atoi(argv[]); //监听队列的大小
  26. else
  27. lisnum = ;
  28.  
  29. //创建socket对象, IPv4, TCP, 默认协议
  30. if((sockfd = socket(AF_INET, SOCK_STREAM, )) == -) //创建socket对象
  31. {
  32. perror("socket");
  33. exit(EXIT_FAILURE);
  34. }
  35.  
  36. bzero(&my_addr, sizeof(my_addr));
  37. my_addr.sin_family = AF_INET; //地址协议
  38. my_addr.sin_port = htons(myport); //地址端口
  39. if(argv[])
  40. my_addr.sin_addr.s_addr = inet_addr(argv[]); //指定IP地址 从点分十进制字符串转为32位二进制
  41. else
  42. my_addr.sin_addr.s_addr = INADDR_ANY; //否则设置为本机任意地址
  43.  
  44. char mybuf[];
  45. inet_ntop(AF_INET, &my_addr.sin_addr.s_addr, mybuf, );
  46. printf("the ip is '%s'\n", mybuf);
  47. //绑定地址信息
  48. if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -)
  49. {
  50. perror("bind");
  51. exit(EXIT_FAILURE);
  52. }
  53.  
  54. //监听网络
  55. if(listen(sockfd, lisnum) == -)
  56. {
  57. perror("listen");
  58. exit(EXIT_FAILURE);
  59. }
  60. printf("wait for connect\n");
  61. len = sizeof(struct sockaddr);
  62.  
  63. //阻塞等待连接
  64. if((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &len)) == -)
  65. {
  66. perror("accept");
  67. exit(EXIT_FAILURE);
  68. }
  69. else //打印接收到的信息
  70. {
  71. printf("server: got connection from %s, port %d, socket %d\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd);
  72. }
  73.  
  74. //创建新进程
  75. if(- == (pid = fork()))
  76. {
  77. perror("fork");
  78. exit(EXIT_FAILURE);
  79. }
  80. else if( == pid) //子进程用于发送消息
  81. {
  82. while()
  83. {
  84. bzero(buf, MAXBUF + );
  85. printf("input the message to send:");
  86. fgets(buf, MAXBUF, stdin);
  87. if(!strncasecmp(buf, "quit", ))
  88. {
  89. printf("i will close the connect!\n");
  90. break;
  91. }
  92. len = send(new_fd, buf, strlen(buf) - , );
  93. if(len < )
  94. {
  95. printf("message '%s' send failure! errno code is %d, errno message is '%s'\n", buf, errno, strerror(errno));
  96. break;
  97. }
  98. }
  99. }
  100. else //父进程用于接收消息
  101. {
  102. while()
  103. {
  104. bzero(buf, MAXBUF + );
  105. len = recv(new_fd, buf, MAXBUF, );
  106. if(len > )
  107. {
  108. printf("message recv successful : '%s', %dByte recv\n", buf, len);
  109. }
  110. else if(len < )
  111. {
  112. printf("recv failure! errno code is %d, errno message is '%s'\n", errno, strerror(errno));
  113. break;
  114. }
  115. else
  116. {
  117. printf("the other one close quit\n");
  118. break;
  119. }
  120. }
  121. }
  122.  
  123. close(new_fd);
  124. close(sockfd);
  125. return ;
  126. }

客户端代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<errno.h>
  4. #include<sys/socket.h>
  5. #include<resolv.h>
  6. #include<stdlib.h>
  7. #include<netinet/in.h>
  8. #include<arpa/inet.h>
  9. #include<unistd.h>
  10. #define MAXBUF 1024
  11. int main(int argc, char **argv)
  12. {
  13. int sockfd, len;
  14. struct sockaddr_in dest;
  15. char buffer[MAXBUF + ];
  16. if(argc != )
  17. {
  18. printf(" error format, it must be :\n \t\t%s IP port\n", argv[]);
  19. exit(EXIT_FAILURE);
  20. }
  21.  
  22. //创建socket对象
  23. if((sockfd = socket(AF_INET, SOCK_STREAM, )) < )
  24. {
  25. perror("Socket");
  26. exit(errno);
  27. }
  28. printf("socket created\n");
  29. bzero(&dest, sizeof(dest));
  30. dest.sin_family = AF_INET; //地址协议
  31. dest.sin_port = htons(atoi(argv[])); //对方端口
  32. //对方IP地址
  33. if(inet_aton(argv[], (struct in_addr *)&dest.sin_addr.s_addr) == )
  34. {
  35. perror("argv[1]");
  36. exit(errno);
  37. }
  38. //发起连接
  39. if(connect(sockfd, (struct sockaddr *)&dest, sizeof(dest)) == -)
  40. {
  41. perror("Connect");
  42. exit(errno);
  43. }
  44. printf("server connected\n");
  45. pid_t pid;
  46.  
  47. //创建子进程
  48. if(- == (pid = fork()))
  49. {
  50. perror("fork");
  51. exit(errno);
  52. }
  53. else if(pid == ) //子进程用于数据接收
  54. {
  55. while()
  56. {
  57. bzero(buffer, MAXBUF + );
  58. len = recv(sockfd, buffer, MAXBUF, );
  59. if(len > )
  60. {
  61. printf("recv successful:'%s', %d byte recv\n", buffer, len);
  62. }
  63. else if(len < )
  64. {
  65. perror("recv");
  66. break;
  67. }
  68. else
  69. {
  70. printf("the other one close, quit\n");
  71. break;
  72. }
  73. }
  74. }
  75. else //父进程用于数据发送
  76. {
  77. while()
  78. {
  79. bzero(buffer, MAXBUF + );
  80. printf("input the message to send:");
  81. fgets(buffer, MAXBUF, stdin);
  82. if(!strncasecmp(buffer, "quit", ))
  83. {
  84. printf("i will close the connect!\n");
  85. break;
  86. }
  87. len = send(sockfd, buffer, strlen(buffer) - , );
  88. if(len < )
  89. {
  90. printf("message '%s' send failure! errno code is %d, errno message is '%s'\n", buffer, errno, strerror(errno));
  91. break;
  92. }
  93. }
  94. }
  95. close(sockfd);
  96. return ;
  97. }

【linux高级程序设计】(第十三章)Linux Socket网络编程基础 3的更多相关文章

  1. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

    BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符, ...

  2. Socket网络编程-基础篇

    Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...

  3. python全栈开发从入门到放弃之socket网络编程基础

    网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...

  4. 第九章:Python の 网络编程基础(一)

    本課主題 何为TCP/IP协议 初认识什么是网络编程 网络编程中的 "粘包" 自定义 MySocket 类 本周作业 何为TCP/IP 协议 TCP/IP协议是主机接入互网以及接入 ...

  5. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 4

    网络调试工具 tcpdump 功能:打印指定网络接口中与布尔表达式匹配的报头信息 关键字: ①类型:host(默认).net.port host 210.27.48.2 //指明是一台主机 net 2 ...

  6. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础

    IP地址定义: struct in_addr{ __u32 s_addr; }; in_addr_t  inet_addr (__const char * __cp) :把点分十进制IP地址字符串转换 ...

  7. 第十三章:Python の 网络编程进阶(二)

    本課主題 SQLAlchemy - Core SQLAlchemy - ORM Paramiko 介紹和操作 上下文操作应用 初探堡垒机 SQLAlchemy - Core 连接 URL 通过 cre ...

  8. 第十三篇:socket网络编程

    本篇主要介绍网络编程的基础,以及UDP/TCP网络的socket编程,关于UDP套接字聊天器的实现.以及基于TCP套接字的服务器/客户端的实现上传下载功能. 一.网络通信 关于网络通信即通过网络(介质 ...

  9. socket网络编程基础小记

    "一切皆Socket!" 话虽些许夸张.可是事实也是,如今的网络编程差点儿都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通 ...

  10. java架构《Socket网络编程基础篇》

    本章主要介绍Socket的基本概念,传统的同步阻塞式I/O编程,伪异步IO实现,学习NIO的同步非阻塞编程和NIO2.0(AIO)异步非阻塞编程. 目前为止,Java共支持3种网络编程模型:BIO.N ...

随机推荐

  1. Java文件 ---RandomAccessFile示例

    RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件 ...

  2. P3819 松江1843路(洛谷月赛)

    P3819 松江1843路 题目描述 涞坊路是一条长L米的道路,道路上的坐标范围从0到L,路上有N座房子,第i座房子建在坐标为x[i]的地方,其中住了r[i]人. 松江1843路公交车要在这条路上建一 ...

  3. Java 虚拟机结构分析

    本博文主要介绍了JVM(Java Virtual Machine)的组成部分以及它们内部的工作机制和原理.需要注意的是,虽然平时我们用的大多是Sun(现已被Oracle收购)JDK提供的JVM,但是J ...

  4. XSS注入常用语句积累

    <script>alert('hello,gaga!');</script> //经典语句,哈哈! >"'><img src="javas ...

  5. jenkins构建定时任务

    jenkins构建定时任务的主要两种形式 1.Build periodically:周期性构建项目,无论有没有代码更新到时间都会构建项目 2.Poll SCM:定时检查源码变更(根据SCM软件的版本号 ...

  6. excel批量导入

    https://www.cnblogs.com/mingyue1818/p/4828865.html

  7. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  8. 孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法

    孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步的语音笔记朗读:https://www.ximalaya.com/keji/1 ...

  9. Wordpress 后台文章编辑区添加模板选择功能

    功能:后台编辑文章时,可以选择文章使用的模板,效果如下图: 操作步骤: <?php /** * Template Name: kbsingle full * Add by Ryan 3/18/2 ...

  10. 【Android】实验6 在应用程序中播放音频和视频 截止提交报告时间2016.4.21

    注:也可以在数独游戏项目中完成该实验的内容.