什么原封发回就是了。 基于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。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)