| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include <sys/socket.h>
- #include <netdb.h>
- #include "Practical.h"
- #include "ch4_common.h"
- int main(int argc, char **argv) {
- if (argc != 2) {
- DieWithUserMessage("Parameter(s)", "<Server Port/Service");
- }
- char *service = argv[1];
- struct addrinfo addr_criteria = { 0 };
- addr_criteria.ai_family = AF_UNSPEC;
- addr_criteria.ai_flags = AI_PASSIVE;
- addr_criteria.ai_socktype = SOCK_DGRAM;
- addr_criteria.ai_protocol = proto_get_num("udp");
- struct addrinfo *serv_addr = nullptr;
- int ret = getaddrinfo(nullptr, service, &addr_criteria, &serv_addr);
- if (ret != 0) {
- DieWithUserMessage("getaddrinfo() failed", gai_strerror(ret));
- }
- int sock = socket(
- serv_addr->ai_family,
- serv_addr->ai_socktype,
- serv_addr->ai_protocol
- );
- if (sock < 0) {
- DieWithSystemMessage("socket() failed");
- }
- if (bind(sock, serv_addr->ai_addr, serv_addr->ai_addrlen) < 0) {
- DieWithSystemMessage("bind() failed");
- }
- fputs("Listening on ", stdout);
- PrintSocketAddress(serv_addr->ai_addr, stdout);
- fputc('\n', stdout);
- freeaddrinfo(serv_addr);
- while (true) {
- struct sockaddr_storage client_addr;
- socklen_t client_addr_len = sizeof(client_addr);
- char buf[MAXSTRINGLENGTH];
- const ssize_t num_bytes_recvd = recvfrom(
- sock,
- buf,
- MAXSTRINGLENGTH,
- 0,
- (struct sockaddr *) &client_addr,
- &client_addr_len
- );
- if (num_bytes_recvd < 0) {
- DieWithSystemMessage("recvfrom() failed");
- }
- fputs("Handling client ", stdout);
- PrintSocketAddress((struct sockaddr *) &client_addr, stdout);
- fputc('\n', stdout);
- const ssize_t num_bytes_sent = sendto(
- sock,
- buf,
- num_bytes_recvd,
- 0,
- (struct sockaddr *) &client_addr,
- client_addr_len
- );
- if (num_bytes_sent < 0) {
- DieWithSystemMessage("sendto() failed");
- } else if (num_bytes_sent != num_bytes_recvd) {
- DieWithUserMessage("sendto()", "sent unexpected number of bytes");
- }
- }
- }
|