/**************************************************************************** * send.c - partner program to "receive.c". This utility copies its standard * input to the port specified by the machine (a.b.c.d or hostname) and port * number specified as parameters. * * Phil Gibbs - Trinem Consulting (pgibbs@trinem.co.uk) ****************************************************************************/ #include #include #include #include #include #include #include typedef struct socket_tag{ struct sockaddr_in name; int port; int sock; } SOCKET; SOCKET *EstablishOutgoingConnection(int destination_port,char *HostName) { int sock; struct sockaddr_in name; struct hostent *hp, *gethostbyname(); SOCKET *reply; hp = gethostbyname(HostName); /* Create a socket on which to send. */ sock = socket(AF_INET, SOCK_STREAM, 0); assert(sock>0); name.sin_family = AF_INET; name.sin_addr.s_addr = *((int *)hp->h_addr); name.sin_port = htons(destination_port); if (connect(sock,(struct sockaddr *)&name,sizeof(name))<0) { perror("Failed to Connect"); exit(1); } reply=(SOCKET *)malloc(sizeof(SOCKET)); reply->sock = sock; reply->name = name; reply->port = destination_port; return reply; } void CloseSocket(SOCKET *sock) { close(sock->sock); free(sock); } void CopyStandardInToSocket(SOCKET *sock) { char Buffer[2048]; int DataLength; while (DataLength=read(0,Buffer,sizeof(Buffer))) { if (sendto(sock->sock,Buffer,DataLength,0, (struct sockaddr *)&(sock->name), sizeof(sock->name)) < 0) perror("sending stream message"); } } void ShowUsageAndExit() { fprintf(stderr,"USAGE: send \n"); exit(1); } main(int argc, char **argv) { int base_port; SOCKET *sock; if (argc!=3) ShowUsageAndExit(); base_port=atol(argv[2]); if (base_port) { sock=EstablishOutgoingConnection(base_port,argv[1]); CopyStandardInToSocket(sock); CloseSocket(sock); } else ShowUsageAndExit(); }