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

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

结果应为类似所示:

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

Server 部分:

 /* TCPServer.cpp - main */

 #include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#include "conio.h" #define QLEN 5
#define WSVERS MAKEWORD(2, 0)
#define BUFLEN 20000
#pragma comment(lib,"ws2_32.lib") //使用winsock 2.2 library
/*------------------------------------------------------------------------
* main - Iterative TCP server for TIME service
*------------------------------------------------------------------------
*/
char buf[];
char buf1[];
char buf2[];
void main(int argc, char *argv[])
/* argc: 命令行参数个数, 例如:C:\> TCPServer 8080
argc=2 argv[0]="TCPServer",argv[1]="8080" */
{
struct sockaddr_in fsin; /* the from address of a client */
SOCKET msock, ssock; /* master & slave sockets */
WSADATA wsadata;
char *service = "";
struct sockaddr_in sin; /* an Internet endpoint address */
int alen; /* from-address length */
char *pts; /* pointer to time string */
// char pts[2000];
time_t now; /* current time */
int cc; WSAStartup(WSVERS, &wsadata); // 加载winsock library。WSVERS指明请求使用的版本。wsadata返回系统实际支持的最高版本
msock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字,参数:因特网协议簇(family),流套接字,TCP协议
// 返回:要监听套接字的描述符或INVALID_SOCKET memset(&sin, , sizeof(sin)); // 从&sin开始的长度为sizeof(sin)的内存清0
sin.sin_family = AF_INET; // 因特网地址簇(INET-Internet)
sin.sin_addr.s_addr = INADDR_ANY; // 监听所有(接口的)IP地址。
sin.sin_port = htons((u_short)atoi(service)); // 监听的端口号。atoi--把ascii转化为int,htons--主机序到网络序(16位)
bind(msock, (struct sockaddr *)&sin, sizeof(sin)); // 绑定监听的IP地址和端口号 listen(msock, ); // 等待建立连接的队列长度为5 while(!_kbhit()){ // 检测是否有按键
alen = sizeof(struct sockaddr); // 取到地址结构的长度
ssock = accept(msock, (struct sockaddr *)&fsin, &alen); // 如果有新的连接请求,返回连接套接字,否则,被阻塞。fsin包含客户端IP地址和端口号 (void) time(&now); // 取得系统时间
pts = ctime(&now); // 把时间转换为字符串
sprintf(buf,"IP :%s 端口号: %d\n",inet_ntoa(fsin.sin_addr),fsin.sin_port);
// sprintf(buf,"%d:%d Hello my friends ! %s",inet_ntoa(sin.sin_addr),fsin.sin_port,pts);
(void) send(ssock, buf, strlen(pts), ); // 把缓冲区(指针,长度)的数据发送出去
printf(" TCP(Server) Echo增强程序 \n\n");
printf(" 时间: %s\n", pts);
printf(" %s\n", buf); // 显示发送字符串
printf("请等待接收数据 :\n"); //flag1:
// printf("\n您还要传送什么?\n");
// printf(" 如果想临时改为接收,请键入 * \n");
// scanf("%s",pts); // if(pts[0] == '*')
// {
// printf("\n请等待接收数据\n");
// sprintf(buf1,"%s",pts);
// (void) send(ssock, buf1, strlen(pts), 0);
// goto flag2;
// }
// sprintf(buf1,"%s",pts);
// (void) send(ssock, buf1, strlen(pts), 0);
// goto flag1;
// ssock = accept(msock, (struct sockaddr *)&fsin, &alen); flag2: cc = recv(ssock, buf1, BUFLEN, );
if(cc == SOCKET_ERROR || cc==)
printf("Error: %d.\n",GetLastError()); //出错。其后必须关闭套接字sock。
else if(cc > ) {
buf1[cc] = '\0'; // ensure null-termination
buf2[cc] = '\0';
// if(buf1[0] == '#')
// {
// printf("\n您接收到的数据为: # , 请传输数据 \n");
// goto flag2;
// }
(void) time(&now);
pts = ctime(&now);
sprintf(buf2,"%s \n %s",pts,buf1);
// strcat(buf2,buf1);
printf("\n您接收到的数据为:");
// printf(" 时间: %s\n", pts);
printf("%s\n", buf2);
printf("\n 将自动把此数据返回给客户!\n");
(void) send(ssock, buf1, strlen(pts), );
goto flag2;
}
(void) closesocket(ssock); // 关闭连接套接字
}
(void) closesocket(msock); // 关闭监听套接字
WSACleanup(); // 卸载winsock library }

Client 部分:

 /* TCPClient.cpp */

 #include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <time.h>
#include "conio.h"
#define BUFLEN 20000 // 缓冲区大小
#define WSVERS MAKEWORD(2, 0) // 指明版本2.0
#pragma comment(lib,"ws2_32.lib") // 使用winsock 2.0 Llibrary /*------------------------------------------------------------------------
* main - TCP client for TIME service
*------------------------------------------------------------------------
*/
char buf1[BUFLEN+];
char buf[BUFLEN+]; /* buffer for one line of text */
void main(int argc, char *argv[])
{
char *host = "127.0.0.1";
// char *host = "10.4.4.146"; /* server IP to connect */ char *service = ""; /* server port to connect */
struct sockaddr_in sin,fsin; /* an Internet endpoint address */ SOCKET sock,ssock; /* socket descriptor */
int cc,alen; /* recv character count */
char *pts ;
time_t now;
WSADATA wsadata;
WSAStartup(WSVERS, &wsadata); //加载winsock library。WSVERS为请求的版本,wsadata返回系统实际支持的最高版本 sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //创建套接字,参数:因特网协议簇(family),流套接字,TCP协议 //返回:要监听套接字的描述符或INVALID_SOCKET memset(&sin, , sizeof(sin)); // 从&sin开始的长度为sizeof(sin)的内存清0
sin.sin_family = AF_INET; // 因特网地址簇
sin.sin_addr.s_addr = inet_addr(host); // 服务器IP地址(32位)
sin.sin_port = htons((u_short)atoi(service)); // 服务器端口号
connect(sock, (struct sockaddr *)&sin, sizeof(sin)); // 连接到服务器
// alen = sizeof(struct sockaddr);
// ssock = accept(sock, (struct sockaddr *)&fsin, &alen);
printf(" TCP(Client) Echo增强程序 \n\n");
flag1: cc = recv(sock, buf1, BUFLEN+, ); // cc为接收到的字符的个数(>0)或对方已关闭(=0)或连接出错(<0)
if(cc == SOCKET_ERROR || cc==)
printf("Error: %d.\n",GetLastError()); //出错。其后必须关闭套接字sock。
else if(cc > ) {
buf1[cc] = '\0'; // ensure null-termination
// if(buf[0] == '*')
// {
// printf("\n您接收到的数据为: * , 请传输数据 \n");
// goto flag2;
// }
(void) time(&now); // 取得系统时间
pts = ctime(&now);
printf("您接收到的数据为:\n");
printf(" 时间: %s\n",pts);
printf(" %s\n",buf1); // 显示所接收的字符串
}
goto flag2; flag2: printf("\n您想传送什么?\n");
printf(" 如果想关闭连接,请输入 @ \n");
// printf("\n 如果想临时改为接收,请键入 # \n");
scanf("%s",pts);
if(pts[] == '@')
goto end;
// if(pts[0] == '#')
// {
// printf("\n请等待接收数据\n");
// sprintf(buf1,"%s",pts);
// (void) send(sock, buf1, strlen(pts), 0);
// goto flag1;
// }
sprintf(buf1,"%s",pts);
(void) send(sock, buf1, strlen(pts), );
goto flag1;
end: closesocket(sock); // 关闭监听套接字 WSACleanup(); // 卸载winsock library printf("\n按回车键继续...");
getchar(); // 等待任意按键
}

【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. SQL Union 和Union All 的区别

    Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并 ...

  2. .net core 自制错误日志

    前言 之前.net framework用的ErrorLog帮助类,对于监控错误形成日志,内容非常清晰,想在.net core2.2中继续用,但是有很多不一样的地方,所以想总结一下. 首先需要HttpC ...

  3. 【C#】在datatable中添加一序号列,编号从1依次递增,并且在第一列

    详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeak/// <summary> ...

  4. 总结常见的违背Rest原则的接口设计做法

    此文已由作者郑华斌授权网易云社区发布. REST这词我们常常挂在嘴边,比如"开发一个rest接口",又比如Spring项目的代码: @RestControllerpublic cl ...

  5. Android 多图,大图内存优化

    策略: 1. 图片压缩 如果所需尺寸大于图片原始尺寸,可以压缩图片节省内存. 2. 图片缓存 每个图片加载时都会生成一个 Bitmap.把这些 Bitmap 缓存起来以重用相同的图片,避免重复创建. ...

  6. python中的函数(基础)

    1.什么是函数 函数是指将一组数据的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用函数名即可 (函数就是对功能或者动作的封装) 2.函数的语法和定义 def 函数名() 函数体 调用: ...

  7. 微信小程序下可以使用的MD5以及AES加密(通用)

    两段代码都来自网络 ,在小程序下的加解密结果与CS/BS等算出的结果都一致,支持汉字. 一.MD5: var rotateLeft = function (lValue, iShiftBits) { ...

  8. 从Oracle官网学习oracle数据库和java

    网上搜索Oracle官网:oracle官网 进入Oracle官网 点击menu-Documentation-Java/Database,进入Oracle官网的文档网站 首先是Java,可以看到Java ...

  9. 2016级算法期末模拟练习赛-E.AlvinZH的青春记忆III

    1083 AlvinZH的青春记忆III 思路 难题,二分图. 说这是一个考察二分图的题目,你可以会说"不可能",这哪里像一个二分图了!这真的是一个二分图,考察的是最小顶点覆盖. ...

  10. jQuery 获取元素当前位置offset()与position()

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...