void *memmove(void *dst, const void *src, size_t len); void *memcpy(void *dst, const void *src, size_t len); void *memset(void *b, int c, size_t len);
Memmove deals with the case where the destination and source buffers overlap. Memcpy does not.
How to create a UDP socket:
if ((s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { perror ("socket"); exit (1); }
How to set the port on which you'll be listening (a.k.a binding the socket)
struct sockaddr_in addr; /* * Bind a port to receive data on */ memset (&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(0); /* 0 means we don't care */ /* for server: addr.sin_port = htons (svc_port); where svc_port is the well-known port for that RPC service. */ if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror ("bind"); exit (-1); }
How to read/write packets from a UDP socket:
ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, int *fromlen); ssize_t sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, int tolen);
How to get the number of clock ticks since boot time:
clock_t ticks; ticks = times(NULL);
How to convert those clock ticks into seconds:
int ticks_per_second = sysconf (_SC_CLK_TCK);
Read with timeout stuff:
/* Note: s is the UDP socket */ { struct timeval timeout; fd_set readfs; ssize_t bytes_read; timeout.tv_sec = 0; timeout.tv_usec = 100; FD_ZERO( &readfds ); FD_SET ( s, &readfds ); res = select(s+1, &readfds, NULL, NULL, &timeout); if (res == -1) { perror ("select"); } if (res > 0) { bytes_read = recvfrom(s, buf, len, flags, from fromlen); act_on_bytes_read(); } /* See if anything's expired */ check_timers(); }
Lab 2 requires you to define three new types. In C, new types are declared using the typedef keyword.
typedef int color; color tas_favorite_color; struct _SVCDAT { int socket; ... }; typedef struct _SVCDAT SVCDAT; typedef struct _CLIREQ { int client_id; .... } CLIREQ;
Constantine Sapuntzakis
February 28, 1997