什么叫echo服务

什么叫echo服务,第1张

Echo服务是一种非常有用的用于调试和检测的工具。这个协议的作用也十分简单,接收到

什么原封发回就是了。 基于TCP协议的Echo服务有一种Echo服务被定义为在TCP协议上的面向

连接的应用。服务器就在TCP端口7检测有无消息,如果有发送来的消息直接返回就是了

服务器端代码

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <sys/wait.h>

#define SERVPORT 7 /*服务器监听端口号 */

#define BACKLOG 10 /* 最大同时连接请求数 */

#define BUFF_SIZE 1024

void main()

{

int sockfd,client_fd/*sock_fd:监听socket;client_fd:数据传输socket */

struct sockaddr_in6 my_addr/* 本机地址信息 */

struct sockaddr_in6 remote_addr/* 客户端地址信息 */

if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1)

{

perror("socket创建出错!")exit(1)

}

bzero(&my_addr, sizeof(my_addr))

my_addr.sin6_family=AF_INET6

my_addr.sin6_port=htons(SERVPORT)

my_addr.sin6_addr = in6addr_any

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in6)) == -1)

{

perror("bind出错!")

exit(1)

}

if (listen(sockfd, BACKLOG) == -1) {

perror("listen出错!")

exit(1)

}

while(1) {

int sin_size = sizeof(struct sockaddr_in)

char temp[INET6_ADDRSTRLEN]

if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {

perror("accept出错")

continue

}

printf("received a connection from %s\n", inet_ntop(AF_INET6, remote_addr.sin6_addr, temp, sizeof(temp)))

if (!fork()) { /* 子进程代码段 */

char buffer[BUFF_SIZE]

int len = recv(client_fd, buffer, BUFF_SIZE, 0)

while(len >0)

{

if (send(client_fd, buffer, len, 0) == -1)

{

perror("unable to send!")

close(client_fd)

exit(1)

}

len = recv(client_fd, buffer, BUFF_SIZE, 0)

}

close(client_fd)

exit(0)

}

close(client_fd)

}

}

客户端

#include<stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define BUFF_SIZE 1024

void main(int argc, char *argv[])

{

int sockfd, len, recv_len

char buf[BUFF_SIZE]

struct sockaddr_in6 serv_addr

if (argc != 3)

{

fprintf(stderr,"Usage: %s dstip dstport\n", argv[0])

exit(1)

}

if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1){

perror("socket 创建出错!")

exit(1)

}

bzero(&serv_addr, sizeof(serv_addr))

serv_addr.sin6_family=AF_INET6

serv_addr.sin6_port=htons(atoi(argv[2]))

if (inet_pton(AF_INET6, argv[1], &serv_addr.sin6_addr) <0)

{

perror(argv[1])

exit(1)

}

if (connect(sockfd, (struct sockaddr *)&serv_addr, \

sizeof(struct sockaddr)) == -1) {

perror("connect出错!")

exit(1)

}

printf("sendmsg>")

gets(buf)

len = send(sockfd, buf, strlen(buf), 0)

if (len != strlen(buf))

{

perror("failed to send msg!")

exit(1)

}

recv_len = recv(sockfd, buf, len, 0)

if (recv_len != len)

{

perror("received length != send")

exit(1)

}

buf[recv_len] = '\0'

printf("recvmsg>%s\n", buf)

close(sockfd)

}

上一章节介绍了使用echo启动一个http服务器并提供一个简单的GET接口,这一章对请求与响应做一下详细的讲解。

了解请求与响应之前首先要知道ehco框架提供了一个Context接口,Context 表示当前 HTTP 请求的上下文,我们需要知道的是Context的实现结构体context,context中包含了请求(request)、响应(response)以及参数等结构体,context是一个内部结构体,但是对外提供了访问的方法,我们可以在开发中使用context提供的方法做很多事情,比如获取请求路径、客户端ip、请求参数等等。

request是包含了当前请求信息的结构体,我们从中可以获取到前后端约定好的参数来作出相应的业务逻辑,这下面开始模拟请求

首先模拟一个添加用户的POST请求,这里使用了c.bind()这个方法,这个方法起到的作用是把表单参数或者JSON参数绑定至对应的结构体(这里必须是指针类型),字段需要一一对应,也就是说前端需要传递的表单或JSON参数名为name、age、gender才能绑定到结构体中。

接下来模拟一个GET请求用来获取用户信息

response是包含了返回信息的结构体,echo提供了多种类型的返回结果

上面编写了处理请求的handler,这里介绍一下如何把handler注册到路由中,这里对应的就是上面handler。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/498365.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-15
下一篇2023-06-15

发表评论

登录后才能评论

评论列表(0条)

    保存