/* These routines simplifies the creation of tcp streaming sockets, both client and server */ #include #include #include #include #include #include #include #include /* The following function opens a client-side socket to a server. It returns a file descriptor on success and -1 on failure. The address specified can be either an ip address or a domain name */ int connectTo(char *address, unsigned short port) { int cfd; // socket file descriptor int socklen, result; struct sockaddr_in saddr; // server address structure struct hostent *hostinfo = NULL; cfd = socket(AF_INET,SOCK_STREAM,0); saddr.sin_family = AF_INET; saddr.sin_port = htons(port); if ((*address >= '0') && (*address <= '9')) saddr.sin_addr.s_addr = inet_addr(address); else // dns lookup { hostinfo = gethostbyname(address); saddr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr *)*(hostinfo->h_addr_list))); //printf("addr is %s\n",inet_ntoa(saddr.sin_addr)); } result = connect(cfd,(struct sockaddr*)&saddr,sizeof(saddr)); if (result < 0) return -1; else return cfd; } /* a server-side socket requires two steps: */ /* 1. creatListener creates a server socket, binds it to a specified port. Returns server socket if sucessful, -1 if bind failed */ int creatListener(unsigned short port) { int sfd, result; struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(port); saddr.sin_addr.s_addr = htonl(INADDR_ANY); sfd = socket(AF_INET,SOCK_STREAM,0); result = 1; setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&result,sizeof(int)); result = bind(sfd,(struct sockaddr*)&saddr,sizeof(saddr)); if (result < 0) return -1; listen(sfd,32); // sets wait queue to 32 connections return sfd; } /* 2. listen for a client connection on a server socket created with creatListener. returns communication socket file descriptor if success, <0 on error. */ int listenOn(int sfd) { int cfd; int slen; struct sockaddr_in clientinfo; /* to be discarded here for simplicity */ slen = sizeof(clientinfo); cfd = accept(sfd,(struct sockaddr*)&clientinfo,&slen); return cfd; }