diff options
Diffstat (limited to 'server.cpp')
-rw-r--r-- | server.cpp | 167 |
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 | |||
16 | using namespace std; | ||
17 | |||
18 | enum robotState { // 机器人状态枚举 | ||
19 | beforeStart, | ||
20 | pending, | ||
21 | afterEnd, // 建好了图,接下来可选择重新建图或选终点开始路径 | ||
22 | startRoute, | ||
23 | }; | ||
24 | |||
25 | enum runState { stop, go, left, right }; | ||
26 | |||
27 | struct ReceiveDataStruct { | ||
28 | int robotId; | ||
29 | robotState state; | ||
30 | int x; | ||
31 | int y; | ||
32 | int r; | ||
33 | }; | ||
34 | |||
35 | const int PORT = 5001; | ||
36 | const char *SERVER_IP = "0.0.0.0"; | ||
37 | const int MAX_BUFFER_SIZE = 1024; | ||
38 | |||
39 | struct ReceiveData { | ||
40 | int values[4]; | ||
41 | }; | ||
42 | |||
43 | bool newDataAvailable = false; | ||
44 | string CLIENT_IP = "127.0.0.1"; | ||
45 | struct sockaddr_in clientAddr; | ||
46 | ReceiveData receivedData = {{0, 1, 2, 3}}; | ||
47 | |||
48 | // UDP发送线程函数 | ||
49 | void 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消息并打印 | ||
90 | void 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 | |||
162 | int main() { | ||
163 | thread receiverThread(receiveAndPrintMessages); | ||
164 | receiverThread.join(); | ||
165 | |||
166 | return 0; | ||
167 | } | ||