善用搜索

Linux网络——应用层协议教程

目录

协议

协议

自定制实例

struct data_t{    
    int num1;    
    int num2;    
    char op;    
};    
#include "tcpsocket.hpp"                                                                    
int main(int argc, char *argv[]){    
    //通过参数传入要连接的服务端的地址信息    
    if (argc != 3) {    
        printf("usage: ./tcp_cli srvip srvport\n");    
        return -1;    
    }    
    std::string srvip = argv[1];    
    uint16_t srvport = std::stoi(argv[2]);    
    TcpSocket cli_sock;    
    //1. 创建套接字    
    CHECK_RET(cli_sock.Socket());    
    //2. 绑定地址信息(不推荐)    
    //3. 向服务端发起连接    
    CHECK_RET(cli_sock.Connect(srvip, srvport));    
    //4. 收发数据    
    struct data_t tmp;    
    tmp.num1 = 11;    
    tmp.num2 = 22;    
    tmp.op = '+';    
    //因为TCP套接字类中的发送数据接口是进行string对象的发送,所以结构体类型的数据我们在外部自己发送
    int fd = cli_sock.GetFd();    //拿到套接字描述符
    send(fd, (void*)&tmp, sizeof(struct data_t), 0);    
    int result;    
    recv(fd, &result, sizeof(int), 0);    
    std::cout << result << std::endl;    
    //5. 关闭套接字    
    CHECK_RET(cli_sock.Close());    
    return 0;    
}    
#include "tcpsocket.hpp"                                                                    
int main(int argc, char *argv[])    {    
    //通过程序运行参数指定服务端要绑定的地址    
    // ./tcp_srv 192.168.2.2 9000    
    if (argc != 3) {    
        printf("usage: ./tcp_src 192.168.2.2 9000\n");    
        return -1;    
    }    
    std::string srvip = argv[1];    
    uint16_t srvport = std::stoi(argv[2]);    
    TcpSocket lst_sock;//监听套接字    
    //1. 创建套接字    
    CHECK_RET(lst_sock.Socket());    
    //2. 绑定地址信息    
    CHECK_RET(lst_sock.Bind(srvip, srvport));    
    //3. 开始监听    
    CHECK_RET(lst_sock.Listen());    
    while(1) {    
        //4. 获取新建连接    
        TcpSocket clisock;    
        std::string cliip;    
        uint16_t cliport;    
        bool ret = lst_sock.Accept(&clisock, &cliip,&cliport);    
        if (ret == false) {    
            continue;    
        }    
        std::cout<<"get newconn:"<< cliip<<"-"<<cliport<<"\n";    
        //5. 收发数据--使用获取的新建套接字进行通信    
        int fd = clisock.GetFd();    
        struct data_t tmp;    
        recv(fd, &tmp, sizeof(struct data_t), 0);    
        int result;    
        //按照结构体格式拿到数据然后返回
        if (tmp.op == '+'){    
            result = tmp.num1 + tmp.num2;    
       }else {
            result = 100;
        }
        send(fd, &result, sizeof(int), 0);
    }
    //6. 关闭套接字
    lst_sock.Close();
}                                                        

HTTP协议

概念

协议格式

首行

请求行
响应行

头部

空行

正文

HTTP 服务器

实例

#include "tcpsocket.hpp"
#include <sstream>

int main(int argc, char *argv[]){
    //利用命令参数来设置IP地址以及端口号,形如:./tcp_srv 192.168.2.2 9000
    if (argc != 3) {
        printf("usage: ./tcp_src 192.168.2.2 9000\n");
        return -1;
    }
    std::string srvip = argv[1]; // ip地址
    uint16_t srvport = std::stoi(argv[2]); //端口号
    TcpSocket lst_sock;// 创建TCP套接字对象
    //初始化监听套接字     
    CHECK_RET(lst_sock.Socket());
    //为监听套接字绑定地址信息
    CHECK_RET(lst_sock.Bind(srvip, srvport));
    //开始监听
    CHECK_RET(lst_sock.Listen());
    while(1) {
        //获取新建连接
        TcpSocket clisock;
        std::string cliip;
        uint16_t cliport;
        bool ret = lst_sock.Accept(&clisock, &cliip,&cliport);
        if (ret == false) {
            continue;
        }
        //接收数据
        std::string buf;
        clisock.Recv(&buf);
        //我们将http请求信息打印字在终端上
        std::cout << "request:["<<buf<<"]\n";
        //下面开始填充响应信息
        std::string body;
        body = "<html><body><h1>Hello Bit</h1></body></html>"; //正文
        std::stringstream ss;
        ss << "HTTP/1.1 500 OK\r\n"; //响应首行
        ss << "Connection: close\r\n"; //头部:短连接
        ss << "Content-Length: " << body.size() << "\r\n"; //头部:正文长度
        ss << "Content-Type: text/html\r\n"; //头部:正文格式
        //下面这行为重定向,如果设置了,那么就会跳转到所设置的服务器
        //ss << "Location: http://www.baidu.com\r\n"; 头部:重定向
        ss << "\r\n"; //空行
        ss << body; 
        //发送数据
        clisock.Send(ss.str());
        //关闭新建连接套接字
        clisock.Close();
    }
    //关闭监听套接字
    lst_sock.Close();
}
发表评论
退出移动版