UDP 클라이언트의 원래 코드는 다음과 같습니다.
while (getline(cin, buf)) {
// c.getConnd() return connected fd
write(c.getConnfd(), buf.c_str(), buf.size());
memset(cbuf, 0, sizeof(cbuf));
read(c.getConnfd(), cbuf, 1024);
LOG(DEBUG) << "read message: " << cbuf;
}
제대로 작동하므로 서버 (recvfrom 및 sendto 사용)도 소켓 바인딩도이 문제를 일으키지 않습니다.
IO 멀티 플렉스를 배우기 위해 IOMultiplexingUtility
사용자가 fd
를 각각의 호출 가능한 객체와 결합 할 수있는 라는 클래스를 작성 합니다. 그것들을 설정 한 후에는 무한 루프로 들어갑니다 (읽을 수있는 fd를 찾으십시오-조치를 취하십시오-다시 기다리십시오).
class IOMultiplexingUtility {
public:
IOMultiplexingUtility() {
FD_ZERO(&socketSet);
}
void addFd(int fd, std::function<void(int)> action) {
maxfd = fd + 1;
FD_SET(fd, &socketSet);
fdVec[fd] = action;
}
void start() {
auto readySet = socketSet;
select(maxfd + 1, &readySet, NULL, NULL, NULL);
for (auto &pair: fdVec)
if (FD_ISSET(pair.first, &readySet)) {
if (pair.second != nullptr)pair.second(pair.first);
else if (defaultAction) defaultAction(pair.first);
}
}
private:
fd_set socketSet;
int maxfd;
std::unordered_map<int, std::function<void(int)>> fdVec;
};
다음과 같이 수정 된 UDP 클라이언트 코드 :
io.addFd(c.getConnfd(), [&c](int)mutable -> void {
char cbuf[1024];
memset(cbuf, 0, sizeof(cbuf));
read(c.getConnfd(), cbuf, 1024);
cout << cbuf << endl;
});
io.addFd(fileno(stdin), [&c](int)mutable -> void {
string buf;
getline(cin, buf);
write(c.getConnfd(), buf.c_str(), buf.size());
});
while (true) io.start();
버그가 발생하여 (텍스트 입력, 서버 수신 및 전송이 성공적으로 이루어졌지만 cbuf
출력되지 않음) 해결 방법을 찾을 수 없습니다. 어떤 아이디어라도 감사합니다.
.NET의 논리 결함처럼 보입니다 addFd
. 생성자에서 와 maxfd = std::max(fd, maxfd)
같이 초기화 maxfd
할 뿐만 아니라와 같은 형식이어야합니다 INT_MIN
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다