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

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

parent 43896687
......@@ -343,19 +343,19 @@ int main(int argc, char *argv[])
::std::uint16_t listenPort
= static_cast<::std::uint16_t>(::std::strtoul(argv[4], nullptr, 10));
// Create socket.
int fd = ::socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
// Create receive socket.
int recvFd = ::socket(AF_INET, SOCK_DGRAM, 0);
if (recvFd < 0) {
int err = errno;
::std::cerr << "Failed to create socket: " << ::strerror(err)
<< ::std::endl;
return -1;
}
::std::unique_ptr<int, void (*)(int *)> autoCloseFd(&fd,
[](int *fd) -> void {
::close(*fd);
*fd = -1;
});
::std::unique_ptr<int, void (*)(int *)> autoCloseRecvFd(
&recvFd, [](int *fd) -> void {
::close(*fd);
*fd = -1;
});
// Bind.
::sockaddr_in bindAddress;
......@@ -366,8 +366,9 @@ int main(int argc, char *argv[])
return -1;
}
bindAddress.sin_port = htons(listenPort);
auto bindResult = ::bind(fd, reinterpret_cast<::sockaddr *>(&bindAddress),
sizeof(bindAddress));
auto bindResult
= ::bind(recvFd, reinterpret_cast<::sockaddr *>(&bindAddress),
sizeof(bindAddress));
if (bindResult < 0) {
int err = errno;
::std::cerr << "Failed to bind listen port: " << ::strerror(err)
......@@ -375,6 +376,26 @@ int main(int argc, char *argv[])
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.
::sockaddr_in targetAddress;
::memset(&targetAddress, 0, sizeof(targetAddress));
......@@ -385,7 +406,7 @@ int main(int argc, char *argv[])
}
targetAddress.sin_port = htons(targetPort);
auto connectResult
= ::connect(fd, reinterpret_cast<::sockaddr *>(&targetAddress),
= ::connect(sendFd, reinterpret_cast<::sockaddr *>(&targetAddress),
sizeof(targetAddress));
if (connectResult < 0) {
int err = errno;
......@@ -395,10 +416,10 @@ int main(int argc, char *argv[])
}
// Reuse.
int opt = 1;
::setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
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.
static int quitEvent = -1;
......@@ -430,7 +451,7 @@ int main(int argc, char *argv[])
auto now = ::std::chrono::steady_clock::now();
if (now - nextTimestamp > ::std::chrono::seconds(1)) {
// Send.
writeData(fd);
writeData(sendFd);
nextTimestamp += ::std::chrono::seconds(1);
if (now > nextTimestamp) {
nextTimestamp = now + ::std::chrono::seconds(1);
......@@ -439,7 +460,7 @@ int main(int argc, char *argv[])
// Wait for data.
::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}};
now = ::std::chrono::steady_clock::now();
auto pollResult = ::poll(
......@@ -452,8 +473,8 @@ int main(int argc, char *argv[])
if (pollResult > 0) {
for (auto &status : fds) {
if (status.revents & POLLIN) {
if (status.fd == fd) {
::readData(fd);
if (status.fd == recvFd) {
::readData(recvFd);
} else if (status.fd == quitEvent) {
::std::cout << "Quit event received." << ::std::endl;
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