X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=old%2Fdatagram.c;fp=old%2Fdatagram.c;h=bcee9431bcd84e2c38fbd09488057d5c99a7287b;hb=0e2dd277897f8959e363564b91dd7d098fb4873c;hp=0000000000000000000000000000000000000000;hpb=6b894156a6cd304f35a959d4388dfb1e1342e844;p=my-code%2Fivac.git diff --git a/old/datagram.c b/old/datagram.c new file mode 100644 index 0000000..bcee943 --- /dev/null +++ b/old/datagram.c @@ -0,0 +1,96 @@ +/* datagram.c - datagram sockets server + * + * author: hackbard + * + */ + +#include +#include + +/* memset */ +#include + +/* socket and bind stuff */ +#include +#include + +/* sockkaddr_in */ +#include + +/* inet_ntoa ... */ +#include + +/* errno stuff ... */ +#include + +/* read, close */ +#include + +/* open */ +#include +#include + +int main(int argc, char *argv[]) { + int send_fd,broadcast_on; + struct sockaddr_in local_addr, remote_addr; + socklen_t remote_addr_len,optlen; + int send_bytes, read_bytes; + FILE *cmd_fd; + + if(argc!=4) { + printf("usage: %s \"cmd command\" \n",argv[0]); + exit(1); + } + + if((send_fd=socket(AF_INET,SOCK_DGRAM,0)) == -1) { + printf("can't open socket.\n"); + exit(1); + } + + broadcast_on=1; + optlen=sizeof(broadcast_on); + if((setsockopt(send_fd,SOL_SOCKET,SO_BROADCAST,&broadcast_on,optlen))==-1) + perror("setsockopt"); + + + memset(&local_addr,0,sizeof(local_addr)); + local_addr.sin_family=AF_INET; + local_addr.sin_port=htons(atoi(argv[3])); + local_addr.sin_addr.s_addr=htonl(INADDR_ANY); + + if(bind(send_fd,(struct sockaddr *)&local_addr,sizeof(local_addr))==-1) { + printf("unable to bind on port %d.\n",atoi(argv[3])); + perror("bind"); + exit(1); + } + + remote_addr_len=sizeof(remote_addr); + memset(&remote_addr,0,sizeof(remote_addr)); + remote_addr.sin_family=AF_INET; + remote_addr.sin_port=htons(atoi(argv[3])); + remote_addr.sin_addr.s_addr=inet_addr(argv[2]); + + if((cmd_fd=popen(argv[1],"w"))<0) { + printf("unable to open file descriptor for %s.\n",argv[1]); + exit(1); + } + + /* send stuff .... */ + read_bytes=1; + while(read_bytes>0) { + unsigned char buf[1000]; + read_bytes=read(0,buf,sizeof(buf)); + send_bytes=sendto(send_fd,buf,read_bytes,0,(struct sockaddr *)&remote_addr,remote_addr_len); +#ifdef DEBUG + perror("sendto"); +#endif + + fwrite(buf,read_bytes,1,cmd_fd); + } + + close(send_fd); + printf("connection closed ...\n"); + printf("%d from %d total bytes sent.\n",send_bytes,read_bytes); + + return 0; +}