--- l2_sockmon.c 2001/09/13 19:18:34 1.8
+++ l2_sockmon.c 2001/09/26 08:55:19 1.9
@@ -27,10 +27,13 @@
** l2_sockmon.c: Socket monitor for use with l2_test.c
*/
+#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <arpa/inet.h>
#include <stdio.h>
+#include <unistd.h>
#include <errno.h>
#include <assert.h>
@@ -39,56 +42,73 @@
#define BACKLOG 1024 /* max # pending connections */
#define BUFFSIZ 256 /* max string size */
-char *strlowerdup(const char *pszIn)
+char *strlowerdup(const char *); /* prototypes */
+void dowork(int);
+int myserver(int, int, int);
+void die(const char *);
+void closedie(int, const char *);
+
+void die(const char *szMsg)
+{
+ perror(szMsg);
+ exit(1);
+}
+
+void closedie(int iSock, const char *szMsg)
+{
+ perror(szMsg);
+ close(iSock);
+ exit(1);
+}
+
+char *strlowerdup(const char *szIn)
{
- int i = 0;
- char *pszTemp = NULL;
+ int i = 0;
+ char *szTemp = NULL;
- assert(pszIn != NULL);
+ assert(szIn != NULL);
- if ((pszTemp = (char *)strdup(pszIn)) == NULL)
+ if ((szTemp = (char *)strdup(szIn)) == NULL)
return NULL;
else
{
- for (i = 0; *(pszTemp + i); i++)
- if (isupper(*(pszTemp + i)))
- *(pszTemp + i) = (char)tolower(*(pszTemp + i));
- return pszTemp;
+ for (i = 0; *(szTemp + i); i++)
+ if (isupper(*(szTemp + i)))
+ *(szTemp + i) = (char)tolower(*(szTemp + i));
+ return szTemp;
}
}
void dowork(int iSock)
{
- char pszBuf[BUFFSIZ];
+ char szBuf[BUFFSIZ];
int cc;
while (1) { /* Exits when read finishes */
- cc = read(iSock, pszBuf, sizeof (pszBuf));
- if (cc == -1) {
- perror("read");
- exit(1);
- }
+ cc = read(iSock, szBuf, sizeof (szBuf));
+ if (cc == -1)
+ die("read()");
if (cc == 0) {
/* EOF */
- (void) close(iSock);
- (void) printf("Connection closed\n");
+ close(iSock);
+ fprintf(stderr, "Connection closed\n");
return;
}
- pszBuf[cc + 1] = '\0';
- (void) printf("Read: %s", pszBuf);
+ szBuf[cc + 1] = '\0';
+ fprintf(stderr, "Read: %s", szBuf);
- if (write(iSock, pszBuf, cc) == -1) {
- perror("write");
- exit(1);
- }
+ if (write(iSock, szBuf, cc) == -1)
+ die("write()");
}
}
int myserver(int iFamily, int iProtocol, int iPort)
{
- char pszBuf[BUFFSIZ];
+ char szBuf[BUFFSIZ];
+ char szAddrin4[INET_ADDRSTRLEN];
+ char szAddrin6[INET6_ADDRSTRLEN];
struct sockaddr_in laddr4, faddr4, caddr4;
struct sockaddr_in6 laddr6, faddr6, caddr6;
int iSock, iNewsock;
@@ -128,28 +148,19 @@
return -1;
}
- /* Tell the system to allow local addresses to be reused. */
+ /* Allow local addresses to be reused. */
iSockopt = 1;
- if (setsockopt(iSock, SOL_SOCKET, SO_REUSEADDR, (void *)&iSockopt,\
- sizeof (iSockopt)) == -1) {
- perror("setsockopt(SO_REUSEADDR)");
- (void) close(iSock);
- return -1;
- }
+ if (setsockopt(iSock, SOL_SOCKET, SO_REUSEADDR, (void *)&iSockopt, sizeof (iSockopt)) == -1)
+ closedie(iSock, "setsockopt(SO_REUSEADDR)");
if (iFamily == AF_INET6) {
- if (bind(iSock, (struct sockaddr *)&laddr6, sizeof (laddr6)) == -1) {
- perror("bind"); /* Bad bind */
- (void) close(iSock);
- return -1;
- }
+ if (bind(iSock, (struct sockaddr *)&laddr6, sizeof (laddr6)) == -1)
+ closedie(iSock, "bind()");
}
+
else if (iFamily == AF_INET) {
- if (bind(iSock, (struct sockaddr *)&laddr4, sizeof (laddr4)) == -1) {
- perror("bind"); /* Bad bind */
- (void) close(iSock);
- return -1;
- }
+ if (bind(iSock, (struct sockaddr *)&laddr4, sizeof (laddr4)) == -1)
+ closedie(iSock, "bind()");
}
if (iProtocol == IPPROTO_UDP) {
@@ -159,30 +170,25 @@
for (;;) { /* Receive messages */
faddrlen = sizeof(caddr6);
- memset(pszBuf, 0x0, BUFFSIZ); /* Init the buffer */
- cc = recvfrom(iSock, pszBuf, BUFFSIZ, 0, (struct sockaddr *)\
+ memset(szBuf, 0x0, BUFFSIZ); /* Init the buffer */
+ cc = recvfrom(iSock, szBuf, BUFFSIZ, 0, (struct sockaddr *)\
&caddr6, &faddrlen);
- if (cc == -1) {
- perror("recvfrom");
- exit(1);
- }
+ if (cc == -1)
+ die("recvfrom()");
- if (cc == 0) {
- /* EOF */
- (void) close(iSock);
- (void) printf("Connection closed\n");
- return;
+ if (cc == 0) { /* EOF */
+ close(iSock);
+ fprintf(stderr, "Connection closed\n");
+ return 0;
}
if (cc != BUFFSIZ) {
- pszBuf[cc + 1] = '\0';
- (void) printf("Read: %s", pszBuf);
+ szBuf[cc + 1] = '\0';
+ fprintf(stderr, "Read: %s", szBuf);
- if (write(iSock, pszBuf, cc) == -1) {
- perror("write");
- exit(1);
- }
+ if (write(iSock, szBuf, cc) == -1)
+ die("write()");
}
else
return -1;
@@ -190,34 +196,29 @@
}
else if (iFamily == AF_INET) {
/* initialize address structure */
- memset(&caddr4, 0, sizeof(caddr4));
+ memset(&caddr4, 0, sizeof(caddr4));
for (;;) { /* Receive messages */
faddrlen = sizeof(caddr4);
- memset(pszBuf, 0x0, BUFFSIZ); /* Init the buffer */
- cc = recvfrom(iSock, pszBuf, BUFFSIZ, 0, (struct sockaddr *)\
+ memset(szBuf, 0x0, BUFFSIZ); /* Init the buffer */
+ cc = recvfrom(iSock, szBuf, BUFFSIZ, 0, (struct sockaddr *)\
&caddr4, &faddrlen);
- if (cc == -1) {
- perror("recvfrom");
- exit(1);
- }
+ if (cc == -1)
+ die("recvfrom()");
- if (cc == 0) {
- /* EOF */
- (void) close(iSock);
- (void) printf("Connection closed\n");
- return;
+ if (cc == 0) { /* EOF */
+ close(iSock);
+ fprintf(stderr, "Connection closed\n");
+ return 0;
}
if (cc != BUFFSIZ) {
- pszBuf[cc + 1] = '\0';
- (void) printf("Read: %s", pszBuf);
+ szBuf[cc + 1] = '\0';
+ fprintf(stderr, "Read: %s", szBuf);
- if (write(iSock, pszBuf, cc) == -1) {
- perror("write");
- exit(1);
- }
+ if (write(iSock, szBuf, cc) == -1)
+ die("write()");
}
else
return -1;
@@ -225,11 +226,8 @@
}
}
else if (iProtocol == IPPROTO_TCP) { /* Only try to listen if we have TCP */
- if (listen(iSock, BACKLOG) == -1) {
- perror("listen"); /* Listen just blew up */
- (void) close(iSock);
- return -1;
- }
+ if (listen(iSock, BACKLOG) == -1)
+ closedie(iSock, "listen()");
/* Wait for a connection request */
if (iFamily == AF_INET6) {
@@ -241,13 +239,17 @@
iNewsock = accept(iSock, (struct sockaddr *)&faddr6, &faddrlen);
if (iNewsock == -1) {
if (errno != EINTR && errno != ECONNABORTED) {
- perror("accept");
+ perror("accept()");
}
continue;
}
- (void) printf("Connection from %s/%d\n",\
- inet_ntop(faddr6.sin6_addr), ntohs(faddr6.sin6_port));
- dowork(iNewsock); /* do some sockwork */
+
+ if (inet_ntop(AF_INET6, &faddr6.sin6_addr, szAddrin6, sizeof(szAddrin6)) != NULL) {
+ fprintf(stderr, "Connection from %s/%d\n", szAddrin6, ntohs(faddr6.sin6_port));
+ dowork(iNewsock); /* do some sockwork */
+ }
+ else
+ die("inet_ntop()");
}
}
else if (iFamily == AF_INET) {
@@ -259,19 +261,17 @@
iNewsock = accept(iSock, (struct sockaddr *)&faddr4, &faddrlen);
if (iNewsock == -1) {
if (errno != EINTR && errno != ECONNABORTED) {
- perror("accept");
+ perror("accept()");
}
continue;
}
- (void) printf("Connection from %s/%d\n",\
- inet_ntop(faddr4.sin_addr), ntohs(faddr4.sin_port));
+ inet_ntop(AF_INET6, &faddr4.sin_addr, szAddrin4, sizeof(szAddrin4));
+ fprintf(stderr, "Connection from %s/%d\n", szAddrin4, ntohs(faddr6.sin6_port));
dowork(iNewsock); /* do some sockwork */
}
}
- /* NOTREACHED */
- }
- else
- return -1; /* We are being asked to serve other than TCP or UDP */
+ } /* NOTREACHED */
+ return -1; /* Failure due to non UDP/TCP request, or execution flow */
}
int main(int argc, char *argv[])
@@ -281,7 +281,7 @@
int iPort = 0;
if (argc != 4) {
- (void) fprintf(stderr, "Usage: %s <IPv4-or-IPv6> <TCP-or-UDP> <Port>\n", argv[0]);
+ fprintf(stderr, "Usage: %s <IPv4-or-IPv6> <TCP-or-UDP> <Port>\n", argv[0]);
exit(1); /* Dink donk if the user doesn't know how to use this */
}
|