aboutsummaryrefslogtreecommitdiffstats
path: root/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'server.cpp')
-rw-r--r--server.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/server.cpp b/server.cpp
new file mode 100644
index 0000000..5e41eb8
--- /dev/null
+++ b/server.cpp
@@ -0,0 +1,167 @@
1#include <arpa/inet.h>
2#include <chrono>
3#include <cmath>
4#include <condition_variable>
5#include <cstring>
6#include <iostream>
7#include <mutex>
8#include <netinet/in.h>
9#include <sstream>
10#include <string.h>
11#include <string>
12#include <sys/socket.h>
13#include <thread>
14#include <unistd.h>
15
16using namespace std;
17
18enum robotState { // 机器人状态枚举
19 beforeStart,
20 pending,
21 afterEnd, // 建好了图,接下来可选择重新建图或选终点开始路径
22 startRoute,
23};
24
25enum runState { stop, go, left, right };
26
27struct ReceiveDataStruct {
28 int robotId;
29 robotState state;
30 int x;
31 int y;
32 int r;
33};
34
35const int PORT = 5001;
36const char *SERVER_IP = "0.0.0.0";
37const int MAX_BUFFER_SIZE = 1024;
38
39struct ReceiveData {
40 int values[4];
41};
42
43bool newDataAvailable = false;
44string CLIENT_IP = "127.0.0.1";
45struct sockaddr_in clientAddr;
46ReceiveData receivedData = {{0, 1, 2, 3}};
47
48// UDP发送线程函数
49void udpSenderThread() {
50 char values[100] = {0};
51 struct sockaddr_in serverAddr;
52 int sockfd = -1;
53
54 // 创建UDP套接字
55 if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
56 fprintf(stderr, "Error: Failed to create socket\n");
57 return;
58 }
59
60 memset((char *)&serverAddr, 0, sizeof(serverAddr));
61 serverAddr.sin_family = AF_INET;
62 serverAddr.sin_port = htons(PORT);
63 if (inet_aton(CLIENT_IP.c_str(), &serverAddr.sin_addr) == 0) {
64 fprintf(stderr, "Error: Failed to convert IP address\n");
65 close(sockfd);
66 return;
67 }
68
69 while (true) {
70 this_thread::sleep_for(chrono::seconds(1)); // 每1秒发送一次
71
72 // 更新发送的消息
73 memset(values, 0, 100);
74 for (int i = 0; i < 4; ++i) {
75 // values[i] = receivedData.values[i] + 1;
76 sprintf(values + strlen(values), "%d ", receivedData.values[i] + 1);
77 }
78 sprintf(values + strlen(values), "\n");
79 printf("Sending message to %s: %s\n", CLIENT_IP.c_str(), values);
80
81 // 发送消息
82 sendto(sockfd, (const char *)values, sizeof(int) * 4, 0,
83 (struct sockaddr *)&serverAddr, sizeof(serverAddr));
84 }
85
86 close(sockfd);
87}
88
89// 主线程接收UDP消息并打印
90void receiveAndPrintMessages() {
91 int sock;
92 struct sockaddr_in serverAddr;
93 socklen_t addrLen = sizeof(clientAddr);
94 char buffer[MAX_BUFFER_SIZE];
95 ReceiveData receivedData;
96 int pos, bytesReceived;
97
98 // 创建UDP套接字
99 if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
100 fprintf(stderr, "Error: Failed to create socket\n");
101 return;
102 }
103
104 memset((char *)&serverAddr, 0, sizeof(serverAddr));
105 memset(buffer, 0, sizeof(buffer));
106 serverAddr.sin_family = AF_INET;
107 serverAddr.sin_port = htons(PORT);
108 serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
109
110 // 绑定到端口
111 if (::bind(sock, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) ==
112 -1) {
113 cerr << "Error: Bind failed" << endl;
114 close(sock);
115 return;
116 }
117
118 bytesReceived = recvfrom(sock, buffer, MAX_BUFFER_SIZE, 0,
119 (struct sockaddr *)&clientAddr, &addrLen);
120 if (bytesReceived == -1) {
121 fprintf(stderr, "Error: Failed to receive data\n");
122 return;
123 }
124 printf("Received Message from %s: %s\n", inet_ntoa(clientAddr.sin_addr),
125 buffer);
126 CLIENT_IP = inet_ntoa(clientAddr.sin_addr);
127 thread senderThread2(udpSenderThread);
128 while (true) {
129 // 接收消息
130 bytesReceived = recvfrom(sock, buffer, MAX_BUFFER_SIZE, 0,
131 (struct sockaddr *)&clientAddr, &addrLen);
132 if (bytesReceived == -1) {
133 fprintf(stderr, "Error: Failed to receive data\n");
134 continue;
135 }
136
137 printf("Receive %d bytes from %s: \"%s\"\n", bytesReceived,
138 CLIENT_IP.c_str(), buffer);
139 pos = 0;
140 for (int i = 0; i < 4; ++i) {
141 receivedData.values[i] = atoi(strtok(buffer + pos, " "));
142 // pos += log10(receivedData.values[i]) + 2;
143 // pos需要递增,否则会一直解析第一个数,要求能处理数据为0或负数的情况
144 pos += strlen(strtok(buffer + pos, " ")) + 1;
145 }
146 newDataAvailable = true;
147
148 // 打印消息
149 // CLIENT_IP = inet_ntoa(clientAddr.sin_addr);
150 // cout << "Received Message from " << CLIENT_IP << ": ";
151 // printf("Received Message from %s: ", CLIENT_IP.c_str());
152 // for (int i = 0; i < 4; ++i) {
153 // printf("%d ", receivedData.values[i]);
154 // }
155 printf("\n");
156 }
157
158 close(sock);
159 senderThread2.join();
160}
161
162int main() {
163 thread receiverThread(receiveAndPrintMessages);
164 receiverThread.join();
165
166 return 0;
167}