微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TCP 数据包编码/解码

如何解决TCP 数据包编码/解码

我正在学习 C++ 并且来自网络工程师的背景,在网络方面编写我熟悉的东西对我来说很有趣。我开始创建一个 BGP speaker

这是我的环境:

[mybgp][bird]

这是my current code

#include <arpa/inet.h>
#include <unistd.h>
#include <string.h> 
#include <errno.h>
#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h>
#include <netinet/in.h> 

#define BIND_ADDR INADDR_ANY
#define BIND_PORT htons(179)

int createServerSocket(){
    //Create Socket
    int serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (serverSocket < 0) {
        fprintf(stderr,"socket(): %s\n",strerror(errno));
        return 1;
    }
    return serverSocket;
}

int createBind(const int &serverSocket,sockaddr_in &serverAddr){
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = BIND_PORT;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    int bind_ret = bind(serverSocket,(sockaddr *) &serverAddr,sizeof(serverAddr));
    // if (bind(serverSocket,(struct sockaddr*) &serverAddr,sizeof(serverAddr)) == -1) {
    //     std::cerr << "Can't bind to ip/port";
    //     return -2;
    // }
    if (bind_ret < 0) {
        fprintf(stderr,"bind(): %s\n",strerror(errno));
        close(serverSocket);
        return 1;
    }
    return bind_ret;
}

int createListener(const int &serverSocket){
    int amount;
    int listen_ret = listen(serverSocket,3);
    if (listen_ret < 0) {
        fprintf(stderr,"listen(): %s\n",strerror(errno));
        close(serverSocket);
        return 1;
    }
    return listen_ret;

}

int acceptConnect(const int &serverSocket,sockaddr_in &clientAddr){
    fprintf(stderr,"waiting for any client...\n");
    char ip_str[INET_ADDRSTRLEN];
    socklen_t caddr_len = sizeof(clientAddr);
    int serverConn = accept(serverSocket,(sockaddr *) &clientAddr,&caddr_len);
    if (serverConn < 0) {
        fprintf(stderr,"accept(): %s\n",strerror(errno));
        close(serverSocket);
        close(serverConn);
        return 1;
    }
    inet_ntop(AF_INET,&(clientAddr.sin_addr),ip_str,INET_ADDRSTRLEN);
    fprintf(stderr,"accept(): new client from %s.\n",ip_str);
    return serverConn;

}

int main(){
    //Create Socket
    int serverSocket = createServerSocket();
    // declare server and client address struct
    // bind socket.
    sockaddr_in serverAddr,clientAddr;
    memset(&serverAddr,sizeof(serverAddr));
    int bind_ret = createBind(serverSocket,serverAddr);
    
    // listening for connection
    int listen_ret = createListener(serverSocket);
    int serverConn = acceptConnect(serverSocket,clientAddr);
    // we only do one at a time,no new client.
    char buffer[4048] = {0};
    char valread;
    valread = read( serverConn,buffer,4048); 
    printf("%s\n",buffer );
    close(serverSocket);
    return 0;
}

我目前的状态是:

  1. 创建套接
  2. 套接字绑定到 IP
  3. 聆听
  4. 接受单个连接(现在是单线程)
  5. 接收到的数据

在第 5 步,我收到了来自 BGP 扬声器 (BIRD) 的乱码 TCP 消息。知道 BGP 协议的工作原理后,此 TCP 消息位于 OPEN Message Format 中。要建立BGP对等体,mybgp和bird需要用不同类型的消息返回并达成一致。

为了能够完成这种对等互连,我必须:

  1. 解码[收到的包裹]
  2. 编码[发送包]

如何对 TCP 数据包进行解码/编码,以便启动 BGP 对等互连过程。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。