forked from array2d/deepx
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathudpserver.cpp
More file actions
66 lines (60 loc) · 1.76 KB
/
udpserver.cpp
File metadata and controls
66 lines (60 loc) · 1.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <sstream>
#include <queue>
#include "client/udpserver.hpp"
namespace client
{
using namespace std;
udpserver::udpserver(int port)
{
this->port = port;
};
udpserver::~udpserver()
{
if (sockfd > 0)
{
::close(sockfd);
}
}
void udpserver::start(queue<deepx::tf::TF> &queue)
{
// 创建UDP套接字
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
// 绑定IP和端口
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(port);
if (::bind(sockfd, (const struct sockaddr *)&servaddr, (socklen_t)sizeof(servaddr)) < 0)
{
perror("bind failed");
::close(sockfd);
exit(EXIT_FAILURE);
}
while (true)
{
len = sizeof(cliaddr);
n = ::recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cliaddr, &len);
buffer[n] = '\0';
// 新增换行拆分逻辑
stringstream ss(buffer);
string line;
while (getline(ss, line)) {
if (!line.empty()) {
deepx::tf::TF tf;
tf.metadata.recv_at = chrono::system_clock::now();
tf.parse(line);
queue.push(tf);
}
}
}
::close(sockfd);
}
void udpserver::resp(string str){
::sendto(sockfd, str.c_str(), str.size(), 0, // 改为sendto
(const struct sockaddr *)&cliaddr, sizeof(cliaddr));
}
}