Skip to content

Instantly share code, notes, and snippets.

@changhengliou
Last active May 30, 2021 20:08
Show Gist options
  • Save changhengliou/93d7edcc91a8537f459450c80def2d1a to your computer and use it in GitHub Desktop.
Save changhengliou/93d7edcc91a8537f459450c80def2d1a to your computer and use it in GitHub Desktop.
Blocking socket programming
int main() {
int socketFd = socket(AF_INET, SOCK_STREAM, 0);
assert(socketFd != 0);
sockaddr_in addr{};
socklen_t addrLen = sizeof(addr);
int opt = 1;
assert(setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)) == 0);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(PORT);
assert(bind(socketFd, (sockaddr *) &addr, addrLen) >= 0);
assert(listen(socketFd, 3) >= 0);
const int acceptFd = accept(socketFd, (sockaddr *) &addr, &addrLen);
assert(acceptFd >= 0);
while (true) {
char buffer[BUFFER_SIZE];
const int len = recv(acceptFd, buffer, sizeof buffer, 0);
if (len > 0) {
const long t = chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
printf("[%d] %.*s\n", t, len, buffer);
} else if (len == 0) {
cout << "Disconnected." << endl;
break;
} else {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
cout << "Waiting for message..." << endl;
std::this_thread::sleep_for(chrono::seconds (1));
continue;
}
assert(false);
}
}
close(acceptFd);
close(socketFd);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment