如何解决TCP 数据包编码/解码
我正在学习 C++ 并且来自网络工程师的背景,在网络方面编写我熟悉的东西对我来说很有趣。我开始创建一个 BGP speaker。
这是我的环境:
[mybgp][bird]
#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;
}
我目前的状态是:
在第 5 步,我收到了来自 BGP 扬声器 (BIRD) 的乱码 TCP 消息。知道 BGP 协议的工作原理后,此 TCP 消息位于 OPEN Message Format 中。要建立BGP对等体,mybgp和bird需要用不同类型的消息返回并达成一致。
为了能够完成这种对等互连,我必须:
- 解码[收到的包裹]
- 编码[发送包]
如何对 TCP 数据包进行解码/编码,以便启动 BGP 对等互连过程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。