|  |         Next: TCP/IP Server Library Header,
 Up: MIDI Controller
 Previous: TCP/IP Client Library Header,
     Contents
 
 The following code provides easy access to Berkeley TCP/IP sockets in a
Unix (Linux) environment.
 
/*****************************************************************************
 * DACS : Distributed Audio Control System
 *============================================================================
 *         File: client.c
 *  Description: TCP/IP client routines
 *       Author: Stephen S. Richardson
 * Date Created: 04.23.95
 *  Environment: GNU C Compiler (GCC) v2.7.1, Linux i486 v2.0.28
 *        Build: library
 *============================================================================
 * The code, executables, documentation, firmware images, and all related
 * material of DACS are  
 * Copyright (C) 1997 Stephen S. Richardson - ALL RIGHTS RESERVED
 *****************************************************************************
 * Source code control:
 *
 * $Id: client.c,v 1.1 1997/07/25 12:15:44 prefect Exp prefect $
 *
 *****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <netdb.h>
#include <time.h>
#include <sys/time.h>
#include "client.h"
/*****************************************************************************
 attempts to connect to an ip and tcp port, returning an fd of the socket
 returns the file descriptor of the socket or
 ERROR_BADHOST - hostname or ip specified is bogus
 ERROR_SOCKET - the 'socket' command failed
 ERROR_CONNECT - the 'connect' command failed
******************************************************************************/
int tcpEstablishConn (char *hostname, int port)
{
  struct sockaddr_in bba;
  struct hostent *hp;
  int s;
  memset (&bba, 0 , sizeof (bba));
  bba.sin_family = AF_INET;
  hp = gethostbyname (hostname);
  if (hp == NULL) return (ERROR_BADHOST);
  memcpy (&bba.sin_addr, hp->h_addr, hp->h_length);
  bba.sin_port = htons ((unsigned short int) port);
  s = socket (AF_INET,SOCK_STREAM,0);
  if (s == -1) return (ERROR_SOCKET);
  if (connect (s,(struct sockaddr *) &bba, sizeof (bba)) !=0)
    return (ERROR_CONNECT);
  return s;
}
/*****************************************************************************
 kills (disconnects) a socket
 returns SUCCESS if it worked or
 ERROR_KILL if it couldn't be disconnected
******************************************************************************/
int tcpKillConn (int fd)
{
  int retcode;
  retcode = close (fd);
  if (retcode==-1) return (ERROR_KILL);
  else return (SUCCESS);
}
/*****************************************************************************
 writes out buffer of size bufsize to an open file descriptor (a socket)
 returns number of bytes written or
 ERROR_WRITEFAILED - write failed
******************************************************************************/
int tcpWriteBuffer (int fd, char *buffer, size_t bufsize)
{
  int retcode;
  
  retcode=write (fd, buffer, bufsize);
  if (retcode==-1) {
    return (ERROR_WRITEFAILED);
  }
  else return (retcode);
}
/*****************************************************************************
 synchronous I/O multiplexer - detects if there's stuff waiting using select
 doesn't disturb the file descriptor set you send
 returns DATA if there's data, or NODATA if there's none
******************************************************************************/
int tcpDataWaiting (int sfd)
{
  fd_set fds;
  struct timeval tv;
  bzero (&tv, sizeof (struct timeval));
  tv.tv_usec = 1;
  FD_ZERO (&fds);
  FD_SET (sfd, &fds);
  while ((select (sfd+1, &fds, NULL, NULL, &tv))==-1); /* make sure select */
                                                       /* works            */
  if (FD_ISSET (sfd, &fds)) return (DATA);
  else return (NODATA);
}
/******************************************************************************
 reads bytes from a socket file descriptor, putting them into the buffer
 returns number of bytes read, or
 ERROR_HANGUP if the socket has been disconnected
******************************************************************************/
int tcpReadBuffer (int fd, char *buffer, int bufsize)
{
  int count;
  count=read (fd, buffer, bufsize);
  if (count==0) {
    close (fd);
    return (ERROR_HANGUP);
  } else if (count==-1) {
    return (ERROR_READ);
  }
  else return (count);
}
 Steve Richardson
2000-07-06
 | Table of Contents 
![[PDF]](/~prefect/images/pdficonsmall.gif) [Whole document in PDF 1.9MB] 
 
[more photos and information]
 |