没有合适的资源?快使用搜索试试~ 我知道了~
Echo实验1
资源详情
资源评论
资源推荐
【实验题目】Echo 实验
【实验目的】掌握套节字的基本使用方法。
【实验说明】
⬧ 把源程序和可执行文件放在相应的上交源码目录中。
⬧ 截屏用按键(Ctrl+Alt+PrintScreen)截取当前窗口
【参考资料】
⬧ https://www.cnblogs.com/hgwang/p/6074038.html (套接字)
⬧ https://www.jb51.net/article/37410.htm (字符串)
⬧ https://docs.microsoft.com/en-us/cpp/c-runtime-library/stream-i-o?view=vs-2017 (字
符串)
⬧ https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/crt-alphabetical-f
unction-reference?view=vs-2017#s (字符串)
⬧ http://www.runoob.com/cprogramming/ (字符串)
【实验环境】
⬧ Windows + VS 2012
⬧ 对于 VS2015 和 VS2017 默认使用安全周期检查,如果不关闭 VS 的安全周期检查,很多字符串函数都
不能用。
⬧ Linux + gcc
⬧ Windows + gcc
【实验内容】
先尝试运行文件夹“TCP”中的程序:先运行 Server 程序(打开 TCPServer.sln,然后执行)再运行
Client 程序(打开 TCPClient.sln,然后执行)。这两个程序的功能是客户端从服务器获取当前时间。
(1)编写 TCP Echo 程序
▪ 实验要求:
服务器把客户端发送来的任何消息都返回给客户端,返回的消息前面要加上服务器的当前时间。
客户端把返回的消息显示出来。客户端每输入一条消息就建立 TCP 连接,并把消息发送给服务器,在
收到服务器回应后关闭连接。
▪ 参考运行截屏:
客户端(两次运行)
服务器:
▪ 只运行客户端程序而不运行服务器程序会出现什么错误,截屏并说明原因。
我的程序充分考虑了这种情况,并有相应的处理措施。这里分为两种情况分别说明:
⚫ 情况一:在服务器没有运行的时候启动客户端
如上图所示,客户端提示“连接到服务器失败”,接着客户端退出。这是因为客户端在执行
connect 函数时就无法连接到服务器,连接失败时 connect 函数返回-1。
⚫ 情况二:客户端启动时服务器是运行的,之后才关闭。即服务器在客户端发送数据时处于关闭状
态
如上图所示,用户输入并回车要发送的消息后,客户端显示错误提示,错误代码为 10054,
查阅错误代码表得知该错误表示“Connection reset by peer”,当服务器关闭了连接时会导致
此错误。
▪ 服务器如何可以退出循环?
服务器运行的过程中,如果有按键按下,那么服务器将在完成一次完整的数据收发之后退出循
环。
这是因为服务器的循环条件为!_kbhit(),这是一个非阻塞的函数,若有键盘输入则返回非 0
值,否则返回 0。函数体内的 accept 函数是阻塞的,若连接队列 msock 为空,它将等待到一个新
的连接建立才会继续执行 accept 之后的语句。因此,期间若有键盘输入,必须会执行完当前函数
体后才会退出循环。
▪ 截屏(ctrl+alt+PrintScreen)服务器和客户端的运行结果(注明服务器和客户端):
▲ TCP 服务器运行截图
▲ TCP 客户端运行截图(共发送了 3 条数据)
▪ 服务器的全部源代码(或自选主要代码):
#include <stdio.h>
#include <time.h>
#include <winsock2.h>
#include <conio.h>
#pragma comment(lib, "ws2_32.lib") //
使用
winsock 2.2 library
#define BUFLEN 2000 //
缓冲区大小
void makeNewMsg(char *msg, char *timestr);
int main()
{
printf("[TCP Echo Server]\n 正在启动服务器...");
struct sockaddr_in clsin; // the from address of a client
struct sockaddr_in sin; // an Internet endpoint address
SOCKET msock, ssock; // master & slave sockets
u_short port = 54321; // server port
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 0), &wsadata); //
加载
Winsock library
,使用
2.0
版本
msock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //
创建主
socket
memset(&sin, 0, sizeof(sin)); //
清零
sin.sin_family = AF_INET; //
因特网地址簇
(INET-Internet)
sin.sin_addr.s_addr = INADDR_ANY; //
监听所有
(
接口的
)IP
地址
sin.sin_port = htons(port); //
监听的端口号(网络序)
bind(msock, (struct sockaddr *)&sin, sizeof(sin)); //
绑定监听的
IP
地址和端口号
listen(msock, 5); //
建立长度为
5
的连接请求队列,
并把到来的连接请求加入队列等待处理
time_t now = time(NULL);
printf("成功。\n 服务器启动时间:%s", ctime(&now));
printf("=======================================\n");
char buf[BUFLEN + 1]; //
建立缓冲区
while (!_kbhit())
{ //
检测是否有按键
,
如
果没有则进入循环体执行
int alen = sizeof(struct sockaddr); //
取到地址结构的长度
ssock = accept(msock, (struct sockaddr *)&clsin, &alen); //
从
socket
,阻塞地
从连接请求队列中创建连接
int recvlen = recv(ssock, buf, BUFLEN, 0); //
接收信息
buf[recvlen] = '\0'; //
保证以空字符结尾
now = time(NULL);
char *timestr = ctime(&now);
printf("收到消息:%s\n", buf);
printf("收到时间:%s", timestr);
printf("---------------------------------------\n");
剩余10页未读,继续阅读
丽龙
- 粉丝: 22
- 资源: 332
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0