本次实验利用TCP/IP, 语言环境为 C/C++

利用套接字Socket编程,实现Server/CLient 之间简单的通讯。

结果应为类似所示:

下面贴上代码(参考参考...)

Server 部分:

  1. /* TCPServer.cpp - main */
  2.  
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <winsock2.h>
  6. #include <time.h>
  7. #include "conio.h"
  8.  
  9. #define QLEN 5
  10. #define WSVERS MAKEWORD(2, 0)
  11. #define BUFLEN 20000
  12. #pragma comment(lib,"ws2_32.lib") //使用winsock 2.2 library
  13. /*------------------------------------------------------------------------
  14. * main - Iterative TCP server for TIME service
  15. *------------------------------------------------------------------------
  16. */
  17. char buf[];
  18. char buf1[];
  19. char buf2[];
  20. void main(int argc, char *argv[])
  21. /* argc: 命令行参数个数, 例如:C:\> TCPServer 8080
  22. argc=2 argv[0]="TCPServer",argv[1]="8080" */
  23. {
  24. struct sockaddr_in fsin; /* the from address of a client */
  25. SOCKET msock, ssock; /* master & slave sockets */
  26. WSADATA wsadata;
  27. char *service = "";
  28. struct sockaddr_in sin; /* an Internet endpoint address */
  29. int alen; /* from-address length */
  30. char *pts; /* pointer to time string */
  31. // char pts[2000];
  32. time_t now; /* current time */
  33. int cc;
  34.  
  35. WSAStartup(WSVERS, &wsadata); // 加载winsock library。WSVERS指明请求使用的版本。wsadata返回系统实际支持的最高版本
  36. msock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字,参数:因特网协议簇(family),流套接字,TCP协议
  37. // 返回:要监听套接字的描述符或INVALID_SOCKET
  38.  
  39. memset(&sin, , sizeof(sin)); // 从&sin开始的长度为sizeof(sin)的内存清0
  40. sin.sin_family = AF_INET; // 因特网地址簇(INET-Internet)
  41. sin.sin_addr.s_addr = INADDR_ANY; // 监听所有(接口的)IP地址。
  42. sin.sin_port = htons((u_short)atoi(service)); // 监听的端口号。atoi--把ascii转化为int,htons--主机序到网络序(16位)
  43. bind(msock, (struct sockaddr *)&sin, sizeof(sin)); // 绑定监听的IP地址和端口号
  44.  
  45. listen(msock, ); // 等待建立连接的队列长度为5
  46.  
  47. while(!_kbhit()){ // 检测是否有按键
  48. alen = sizeof(struct sockaddr); // 取到地址结构的长度
  49. ssock = accept(msock, (struct sockaddr *)&fsin, &alen); // 如果有新的连接请求,返回连接套接字,否则,被阻塞。fsin包含客户端IP地址和端口号
  50.  
  51. (void) time(&now); // 取得系统时间
  52. pts = ctime(&now); // 把时间转换为字符串
  53. sprintf(buf,"IP :%s 端口号: %d\n",inet_ntoa(fsin.sin_addr),fsin.sin_port);
  54. // sprintf(buf,"%d:%d Hello my friends ! %s",inet_ntoa(sin.sin_addr),fsin.sin_port,pts);
  55. (void) send(ssock, buf, strlen(pts), ); // 把缓冲区(指针,长度)的数据发送出去
  56. printf(" TCP(Server) Echo增强程序 \n\n");
  57. printf(" 时间: %s\n", pts);
  58. printf(" %s\n", buf); // 显示发送字符串
  59. printf("请等待接收数据 :\n");
  60.  
  61. //flag1:
  62. // printf("\n您还要传送什么?\n");
  63. // printf(" 如果想临时改为接收,请键入 * \n");
  64. // scanf("%s",pts);
  65.  
  66. // if(pts[0] == '*')
  67. // {
  68. // printf("\n请等待接收数据\n");
  69. // sprintf(buf1,"%s",pts);
  70. // (void) send(ssock, buf1, strlen(pts), 0);
  71. // goto flag2;
  72. // }
  73. // sprintf(buf1,"%s",pts);
  74. // (void) send(ssock, buf1, strlen(pts), 0);
  75. // goto flag1;
  76. // ssock = accept(msock, (struct sockaddr *)&fsin, &alen);
  77.  
  78. flag2: cc = recv(ssock, buf1, BUFLEN, );
  79. if(cc == SOCKET_ERROR || cc==)
  80. printf("Error: %d.\n",GetLastError()); //出错。其后必须关闭套接字sock。
  81. else if(cc > ) {
  82. buf1[cc] = '\0'; // ensure null-termination
  83. buf2[cc] = '\0';
  84. // if(buf1[0] == '#')
  85. // {
  86. // printf("\n您接收到的数据为: # , 请传输数据 \n");
  87. // goto flag2;
  88. // }
  89. (void) time(&now);
  90. pts = ctime(&now);
  91. sprintf(buf2,"%s \n %s",pts,buf1);
  92. // strcat(buf2,buf1);
  93. printf("\n您接收到的数据为:");
  94. // printf(" 时间: %s\n", pts);
  95. printf("%s\n", buf2);
  96. printf("\n 将自动把此数据返回给客户!\n");
  97. (void) send(ssock, buf1, strlen(pts), );
  98. goto flag2;
  99. }
  100. (void) closesocket(ssock); // 关闭连接套接字
  101. }
  102. (void) closesocket(msock); // 关闭监听套接字
  103. WSACleanup(); // 卸载winsock library
  104.  
  105. }

Client 部分:

  1. /* TCPClient.cpp */
  2.  
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <winsock2.h>
  6. #include <string.h>
  7. #include <time.h>
  8. #include "conio.h"
  9. #define BUFLEN 20000 // 缓冲区大小
  10. #define WSVERS MAKEWORD(2, 0) // 指明版本2.0
  11. #pragma comment(lib,"ws2_32.lib") // 使用winsock 2.0 Llibrary
  12.  
  13. /*------------------------------------------------------------------------
  14. * main - TCP client for TIME service
  15. *------------------------------------------------------------------------
  16. */
  17. char buf1[BUFLEN+];
  18. char buf[BUFLEN+]; /* buffer for one line of text */
  19. void main(int argc, char *argv[])
  20. {
  21. char *host = "127.0.0.1";
  22. // char *host = "10.4.4.146"; /* server IP to connect */
  23.  
  24. char *service = ""; /* server port to connect */
  25. struct sockaddr_in sin,fsin; /* an Internet endpoint address */
  26.  
  27. SOCKET sock,ssock; /* socket descriptor */
  28. int cc,alen; /* recv character count */
  29. char *pts ;
  30. time_t now;
  31. WSADATA wsadata;
  32. WSAStartup(WSVERS, &wsadata); //加载winsock library。WSVERS为请求的版本,wsadata返回系统实际支持的最高版本
  33.  
  34. sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //创建套接字,参数:因特网协议簇(family),流套接字,TCP协议
  35.  
  36. //返回:要监听套接字的描述符或INVALID_SOCKET
  37.  
  38. memset(&sin, , sizeof(sin)); // 从&sin开始的长度为sizeof(sin)的内存清0
  39. sin.sin_family = AF_INET; // 因特网地址簇
  40. sin.sin_addr.s_addr = inet_addr(host); // 服务器IP地址(32位)
  41. sin.sin_port = htons((u_short)atoi(service)); // 服务器端口号
  42. connect(sock, (struct sockaddr *)&sin, sizeof(sin)); // 连接到服务器
  43. // alen = sizeof(struct sockaddr);
  44. // ssock = accept(sock, (struct sockaddr *)&fsin, &alen);
  45. printf(" TCP(Client) Echo增强程序 \n\n");
  46. flag1: cc = recv(sock, buf1, BUFLEN+, ); // cc为接收到的字符的个数(>0)或对方已关闭(=0)或连接出错(<0)
  47. if(cc == SOCKET_ERROR || cc==)
  48. printf("Error: %d.\n",GetLastError()); //出错。其后必须关闭套接字sock。
  49. else if(cc > ) {
  50. buf1[cc] = '\0'; // ensure null-termination
  51. // if(buf[0] == '*')
  52. // {
  53. // printf("\n您接收到的数据为: * , 请传输数据 \n");
  54. // goto flag2;
  55. // }
  56. (void) time(&now); // 取得系统时间
  57. pts = ctime(&now);
  58. printf("您接收到的数据为:\n");
  59. printf(" 时间: %s\n",pts);
  60. printf(" %s\n",buf1); // 显示所接收的字符串
  61. }
  62. goto flag2;
  63.  
  64. flag2:
  65.  
  66. printf("\n您想传送什么?\n");
  67. printf(" 如果想关闭连接,请输入 @ \n");
  68. // printf("\n 如果想临时改为接收,请键入 # \n");
  69. scanf("%s",pts);
  70. if(pts[] == '@')
  71. goto end;
  72. // if(pts[0] == '#')
  73. // {
  74. // printf("\n请等待接收数据\n");
  75. // sprintf(buf1,"%s",pts);
  76. // (void) send(sock, buf1, strlen(pts), 0);
  77. // goto flag1;
  78. // }
  79. sprintf(buf1,"%s",pts);
  80. (void) send(sock, buf1, strlen(pts), );
  81. goto flag1;
  82. end: closesocket(sock); // 关闭监听套接字
  83.  
  84. WSACleanup(); // 卸载winsock library
  85.  
  86. printf("\n按回车键继续...");
  87. getchar(); // 等待任意按键
  88. }

【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯的更多相关文章

  1. 【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 "多人聊天室"

    本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,以及线程处理, 实现Server/CLient 之间多人的聊天系统的基本功能. 结果大致如: 下面贴上代码(参考参考.. ...

  2. 【Echo】实验 -- 实现 C/C++下UDP, 服务器/客户端 通讯

    本次实验利用UDP协议, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分: ...

  3. 提升linux下TCP服务器并发连接数(limit)

    https://cloud.tencent.com/developer/article/1069900 1.修改用户进程可打开文件数限制   在Linux平台上,无论编写客户端程序还是服务端程序,在进 ...

  4. 提升linux下tcp服务器并发连接数限制

    1.修改用户进程可打开文件数限制   在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统 ...

  5. TCP服务器/客户端代码示例

    TCP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...

  6. windows下TCP服务器和客户端的实现

      服务器   1.初始化 WSAStartup(..)   2.创建Socket s = Socket ( .. )   3.绑定端口 ret = bind ( ... )   4.监听 ret = ...

  7. Linux下tcp服务器创建的步骤

    创建一个socket,使用函数socket() socket(套接字)实质上提供了进程通信的端点,进程通信之前,双方首先必须建立各自的一个端点,否则没有办法通信.通过socket将IP地址和端口绑定之 ...

  8. 对Qt下对话服务器客户端的总结(MyTcpServer与MyTcpClient)

    在汇文培训老师给讲了这个例子.讲的挺好的 Qt编写聊天服务器与客户端主要用到下面两个类: QTcpSocket --- 处理连接的 QTcpServer --- 处理服务器,对接入进行响应,创建每个链 ...

  9. socket本地模拟TCP 服务器+客户端(二)

    建立两个py文件,分别打开两个cmd界面,即可进行通信.服务器端运用多进程,连续不断的处理从客户端接收到的数据:客户端通过一个list不断给客户端发送数据. (每个连接都必须创建新线程(或进程)来处理 ...

随机推荐

  1. 10-08常用的TIME和DATE函数以及各个函数对应的头文件

    系统时间和日期函数:     #include <time.h>     char *asctime(const struct tm *tm);//将tm中存放的信息转换为标准格式    ...

  2. UDP通讯

    上一篇有说到TCP通讯,这篇来谈谈UDP通讯方式 基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低.至于可靠性,可通过应用层的控制来满足.(不可靠连接) (1).建立一个套接字(Sock ...

  3. java 基础解析

    http://www.cnblogs.com/-new/tag/java%E5%9F%BA%E7%A1%80%E8%A7%A3%E6%9E%90/

  4. composer 学习与推荐资料

    今天看了一下composer,前几天开始用包依赖,以前一直都是自己手动配.今天用了composer,要学习的话可以按照以下链接学习: 1 官方文档: http://docs.phpcomposer.c ...

  5. AcWing 143. 最大异或对

    https://www.acwing.com/problem/content/145 #include <iostream> #include <algorithm> usin ...

  6. Linux下的压缩及归档

    Linux下常用的压缩格式有: gz,bz2,xz,zip,Z //只能压缩文件不能压缩目录,如果传递一个目录,他会把目录中的文件逐个压缩 ..压缩算法:算法不同,压缩比也不同 gz:gzip,压缩后 ...

  7. C#控制台输出退格实现变换闪烁的字符效果

    C#控制台输出退格实现变换闪烁的字符效果,传统的Console.Clear()方法能清除控制台上的所有内容. 如果用 Console.Write('\u0008');可以实现输出退格,这样就可以方便地 ...

  8. Elasticsearch入门CRUD(新增、查询、修改、删除)

    1. 项目中引用 Elasticsearch.NET         Elasticsearch 其他版本可在: http://www.nuget.org/  找到对应的项目以源码 ! 本文以 2.4 ...

  9. D01——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D01 20180705内容纲要: 1 PYTHON介绍 2 PYTHON变量定义规则 3  PYTHON文件结构 4 PYTHON语句及语法 5 字符编码 6 ...

  10. PHP错误——Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)

    解释是可用内存已耗尽,这关系到PHP的memory_limit的设置问题. 这里有两种方法解决 1.修改php.ini memory_limit = 128 打开终端输入下列bash命令 cd /pr ...