Commit b6f96457 authored by 王思远's avatar 王思远

UTC:2025-11-25 8:46:57 :

parent 43896687
...@@ -343,16 +343,16 @@ int main(int argc, char *argv[]) ...@@ -343,16 +343,16 @@ int main(int argc, char *argv[])
::std::uint16_t listenPort ::std::uint16_t listenPort
= static_cast<::std::uint16_t>(::std::strtoul(argv[4], nullptr, 10)); = static_cast<::std::uint16_t>(::std::strtoul(argv[4], nullptr, 10));
// Create socket. // Create receive socket.
int fd = ::socket(AF_INET, SOCK_DGRAM, 0); int recvFd = ::socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) { if (recvFd < 0) {
int err = errno; int err = errno;
::std::cerr << "Failed to create socket: " << ::strerror(err) ::std::cerr << "Failed to create socket: " << ::strerror(err)
<< ::std::endl; << ::std::endl;
return -1; return -1;
} }
::std::unique_ptr<int, void (*)(int *)> autoCloseFd(&fd, ::std::unique_ptr<int, void (*)(int *)> autoCloseRecvFd(
[](int *fd) -> void { &recvFd, [](int *fd) -> void {
::close(*fd); ::close(*fd);
*fd = -1; *fd = -1;
}); });
...@@ -366,7 +366,8 @@ int main(int argc, char *argv[]) ...@@ -366,7 +366,8 @@ int main(int argc, char *argv[])
return -1; return -1;
} }
bindAddress.sin_port = htons(listenPort); bindAddress.sin_port = htons(listenPort);
auto bindResult = ::bind(fd, reinterpret_cast<::sockaddr *>(&bindAddress), auto bindResult
= ::bind(recvFd, reinterpret_cast<::sockaddr *>(&bindAddress),
sizeof(bindAddress)); sizeof(bindAddress));
if (bindResult < 0) { if (bindResult < 0) {
int err = errno; int err = errno;
...@@ -375,6 +376,26 @@ int main(int argc, char *argv[]) ...@@ -375,6 +376,26 @@ int main(int argc, char *argv[])
return -1; return -1;
} }
// Reuse.
int opt = 1;
::setsockopt(recvFd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
opt = 1;
::setsockopt(recvFd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
// Create send socket.
int sendFd = ::socket(AF_INET, SOCK_DGRAM, 0);
if (sendFd < 0) {
int err = errno;
::std::cerr << "Failed to create socket: " << ::strerror(err)
<< ::std::endl;
return -1;
}
::std::unique_ptr<int, void (*)(int *)> autoCloseSendFd(
&sendFd, [](int *fd) -> void {
::close(*fd);
*fd = -1;
});
// Make send address. // Make send address.
::sockaddr_in targetAddress; ::sockaddr_in targetAddress;
::memset(&targetAddress, 0, sizeof(targetAddress)); ::memset(&targetAddress, 0, sizeof(targetAddress));
...@@ -385,7 +406,7 @@ int main(int argc, char *argv[]) ...@@ -385,7 +406,7 @@ int main(int argc, char *argv[])
} }
targetAddress.sin_port = htons(targetPort); targetAddress.sin_port = htons(targetPort);
auto connectResult auto connectResult
= ::connect(fd, reinterpret_cast<::sockaddr *>(&targetAddress), = ::connect(sendFd, reinterpret_cast<::sockaddr *>(&targetAddress),
sizeof(targetAddress)); sizeof(targetAddress));
if (connectResult < 0) { if (connectResult < 0) {
int err = errno; int err = errno;
...@@ -395,10 +416,10 @@ int main(int argc, char *argv[]) ...@@ -395,10 +416,10 @@ int main(int argc, char *argv[])
} }
// Reuse. // Reuse.
int opt = 1;
::setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
opt = 1; opt = 1;
::setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)); ::setsockopt(sendFd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
opt = 1;
::setsockopt(sendFd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
// Create quit event. // Create quit event.
static int quitEvent = -1; static int quitEvent = -1;
...@@ -430,7 +451,7 @@ int main(int argc, char *argv[]) ...@@ -430,7 +451,7 @@ int main(int argc, char *argv[])
auto now = ::std::chrono::steady_clock::now(); auto now = ::std::chrono::steady_clock::now();
if (now - nextTimestamp > ::std::chrono::seconds(1)) { if (now - nextTimestamp > ::std::chrono::seconds(1)) {
// Send. // Send.
writeData(fd); writeData(sendFd);
nextTimestamp += ::std::chrono::seconds(1); nextTimestamp += ::std::chrono::seconds(1);
if (now > nextTimestamp) { if (now > nextTimestamp) {
nextTimestamp = now + ::std::chrono::seconds(1); nextTimestamp = now + ::std::chrono::seconds(1);
...@@ -439,7 +460,7 @@ int main(int argc, char *argv[]) ...@@ -439,7 +460,7 @@ int main(int argc, char *argv[])
// Wait for data. // Wait for data.
::std::array<::pollfd, 2> fds { ::std::array<::pollfd, 2> fds {
::pollfd {.fd = fd, .events = POLLIN, .revents = 0}, ::pollfd {.fd = recvFd, .events = POLLIN, .revents = 0},
::pollfd {.fd = quitEvent, .events = POLLIN, .revents = 0}}; ::pollfd {.fd = quitEvent, .events = POLLIN, .revents = 0}};
now = ::std::chrono::steady_clock::now(); now = ::std::chrono::steady_clock::now();
auto pollResult = ::poll( auto pollResult = ::poll(
...@@ -452,8 +473,8 @@ int main(int argc, char *argv[]) ...@@ -452,8 +473,8 @@ int main(int argc, char *argv[])
if (pollResult > 0) { if (pollResult > 0) {
for (auto &status : fds) { for (auto &status : fds) {
if (status.revents & POLLIN) { if (status.revents & POLLIN) {
if (status.fd == fd) { if (status.fd == recvFd) {
::readData(fd); ::readData(recvFd);
} else if (status.fd == quitEvent) { } else if (status.fd == quitEvent) {
::std::cout << "Quit event received." << ::std::endl; ::std::cout << "Quit event received." << ::std::endl;
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment