From fa6a332e18a1ed735e380d1d2081f5778009d6ab Mon Sep 17 00:00:00 2001 From: hackbard Date: Fri, 18 Oct 2002 14:08:04 +0000 Subject: [PATCH] fixed send(from) recv(from) bug, added dgramrcv.c --- Makefile | 2 +- datagram.c | 32 +++++++++++++++++--------- dgramrcv.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ receive.c | 4 ++-- stream.c | 2 +- 5 files changed, 91 insertions(+), 15 deletions(-) create mode 100644 dgramrcv.c diff --git a/Makefile b/Makefile index 2b51ba5..8076296 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ INCLUDEDIR = /usr/include CFLAGS = -O3 -Wall -OBJS = stream receive datagram +OBJS = stream receive datagram dgramrcv all: $(OBJS) diff --git a/datagram.c b/datagram.c index 83c4bc8..72179b7 100644 --- a/datagram.c +++ b/datagram.c @@ -26,14 +26,18 @@ /* read, close */ #include +/* open */ +#include +#include + int main(int argc, char *argv[]) { - int send_fd; + int send_fd,cmd_fd; struct sockaddr_in local_addr, remote_addr; - socklen_t remote_addr_len; + socklen_t remote_addr_len,optlen; int send_bytes, read_bytes; - if(argc!=3) { - printf("usage: %s \n",argv[0]); + if(argc!=4) { + printf("usage: %s \"cmd command\" \n",argv[0]); exit(1); } @@ -42,15 +46,16 @@ int main(int argc, char *argv[]) { exit(1); } - // setsockopt(send_fd,SOL_SOCKET,SO_BROADCAST, + optlen=1; + setsockopt(send_fd,SOL_SOCKET,SO_BROADCAST,NULL,optlen); memset(&local_addr,0,sizeof(local_addr)); local_addr.sin_family=AF_INET; - local_addr.sin_port=htons(atoi(argv[2])); + 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[1])); + printf("unable to bind on port %d.\n",atoi(argv[3])); perror("bind"); exit(1); } @@ -58,15 +63,20 @@ int main(int argc, char *argv[]) { 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[2])); - remote_addr.sin_addr.s_addr=inet_addr(argv[1]); + remote_addr.sin_port=htons(atoi(argv[3])); + remote_addr.sin_addr.s_addr=inet_addr(argv[2]); + + if((cmd_fd=open(argv[1],O_RDONLY))<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,sizeof(buf),0,(struct sockaddr *)&remote_addr,remote_addr_len); + read_bytes=read(cmd_fd,buf,sizeof(buf)); + send_bytes=sendto(send_fd,buf,read_bytes,0,(struct sockaddr *)&remote_addr,remote_addr_len); } close(send_fd); diff --git a/dgramrcv.c b/dgramrcv.c new file mode 100644 index 0000000..060fd4a --- /dev/null +++ b/dgramrcv.c @@ -0,0 +1,66 @@ +/* dgramrcv.c - receive from udp 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 + +int main(int argc, char *argv[]) { + int receive_fd; + struct sockaddr_in target_addr; + int receive_bytes, write_bytes; + socklen_t target_addr_len,optlen; + + if(argc!=3) { + printf("usage: %s \n",argv[0]); + exit(1); + } + + if((receive_fd=socket(AF_INET,SOCK_DGRAM,0)) == -1) { + printf("can't open socket.\n"); + exit(1); + } + + optlen=1; + setsockopt(receive_fd,SOL_SOCKET,SO_BROADCAST,NULL,optlen); + + memset(&target_addr,0,sizeof(target_addr)); + target_addr.sin_family=AF_INET; + target_addr.sin_port=htons(atoi(argv[2])); + target_addr.sin_addr.s_addr=inet_addr(argv[1]); + target_addr_len=sizeof(target_addr); + + receive_bytes=1; + while(receive_bytes>0) { + unsigned char buf[1000]; + receive_bytes=recvfrom(receive_fd,buf,sizeof(buf),0,(struct sockaddr *)&target_addr,&target_addr_len); + write_bytes=write(1,buf,receive_bytes); + } + + close(receive_fd); + printf("connection closed ...\n"); + printf("%d from %d total bytes written.\n",write_bytes,receive_bytes); + + return 0; +} diff --git a/receive.c b/receive.c index 36f8ffd..65b9b95 100644 --- a/receive.c +++ b/receive.c @@ -32,7 +32,7 @@ int main(int argc, char *argv[]) { int receive_bytes, write_bytes; if(argc!=3) { - printf("usage: %s \n",argv[0]); + printf("usage: %s \n",argv[0]); exit(1); } @@ -58,7 +58,7 @@ int main(int argc, char *argv[]) { while(receive_bytes>0) { unsigned char buf[1000]; receive_bytes=recv(receive_fd,buf,sizeof(buf),0); - write_bytes=write(1,buf,sizeof(buf)); + write_bytes=write(1,buf,receive_bytes); } close(receive_fd); diff --git a/stream.c b/stream.c index da6cc47..834bf47 100644 --- a/stream.c +++ b/stream.c @@ -70,7 +70,7 @@ int main(int argc, char *argv[]) { while(read_bytes>0) { unsigned char buf[1000]; read_bytes=read(0,buf,sizeof(buf)); - send_bytes=send(send_fd,buf,sizeof(buf),0); + send_bytes=send(send_fd,buf,read_bytes,0); } close(send_fd); -- 2.20.1