From: Leandro Lucarella Date: Fri, 23 Jun 2006 13:41:20 +0000 (+0000) Subject: Se saca TCP por abajo del protocolo de resolución (que estaba de más porque va X-Git-Tag: svn_import~24 X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/commitdiff_plain/f17a708ff0e870baf2709bb0d63f32f166e082d3?ds=inline Se saca TCP por abajo del protocolo de resolución (que estaba de más porque va sobre MI IP). Se actualizan pruebas. --- diff --git a/practicas/pipi/src/Makefile b/practicas/pipi/src/Makefile index 9110dca..f76f0e2 100644 --- a/practicas/pipi/src/Makefile +++ b/practicas/pipi/src/Makefile @@ -32,12 +32,15 @@ CC=g++ # Programas targets=ip tests=test_send test_recv test_ipaddr test_ipin test_ipout test_devtcp \ - test_poll test_resolvprotos test_resolvprotoc test_nameserver_file \ + test_poll test_resolvproto test_nameserver_file \ test_nameserver_resolvnext # Fuentes fuentes ?= $(wildcard *.cpp) $(wildcard *.c) +ip_objs=ipout.o ipin.o ipaddr.o ipheader.o devque.o devtcp.o routetable.o \ + libtcp.o +dns_objs=nameserver.o resolvproto.o # REGLAS ######### @@ -62,22 +65,14 @@ test_devtcp: test_devtcp.o devtcp.o libtcp.o ipaddr.o test_poll: test_poll.o libtcp.o -#FIXME no va libtcp.o, debe ir sobre mi implementación de ip. -test_resolvprotos: test_resolvprotos.o libtcp.o ipaddr.o resolvproto.o - -#FIXME no va libtcp.o, debe ir sobre mi implementación de ip. -test_resolvprotoc: test_resolvprotoc.o libtcp.o ipaddr.o resolvproto.o +test_resolvproto: test_resolvproto.o resolvproto.o ipaddr.o -#FIXME no va libtcp.o, debe ir sobre mi implementación de ip. -test_nameserver_file: test_nameserver_file.o ipaddr.o nameserver.o \ - resolvproto.o libtcp.o +test_nameserver_file: test_nameserver_file.o $(dns_objs) $(ip_objs) #FIXME no va libtcp.o, debe ir sobre mi implementación de ip. -test_nameserver_resolvnext: test_nameserver_resolvnext.o ipaddr.o \ - nameserver.o resolvproto.o libtcp.o +test_nameserver_resolvnext: test_nameserver_resolvnext.o $(dns_objs) $(ip_objs) -ip: ip.o ipout.o ipin.o ipaddr.o ipheader.o devque.o devtcp.o routetable.o \ - libtcp.o +ip: ip.o $(ip_objs) depend: @makedepend $(fuentes) > /dev/null 2>&1 @@ -139,6 +134,29 @@ devtcp.o: /usr/include/bits/netdb.h /usr/include/fcntl.h devtcp.o: /usr/include/bits/fcntl.h /usr/include/sys/ipc.h devtcp.o: /usr/include/bits/ipctypes.h /usr/include/bits/ipc.h devtcp.o: /usr/include/sys/msg.h /usr/include/bits/msq.h +dns.o: ipout.h ipaddr.h /usr/include/stdint.h /usr/include/features.h +dns.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h +dns.o: /usr/include/bits/wchar.h /usr/include/bits/wordsize.h ipheader.h +dns.o: routetable.h dev.h ipin.h devtcp.h /usr/include/sys/poll.h +dns.o: /usr/include/bits/poll.h devque.h /usr/include/unistd.h +dns.o: /usr/include/bits/posix_opt.h /usr/include/bits/types.h +dns.o: /usr/include/bits/typesizes.h /usr/include/bits/confname.h +dns.o: /usr/include/getopt.h /usr/include/fcntl.h /usr/include/bits/fcntl.h +dns.o: /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h +dns.o: /usr/include/bits/endian.h /usr/include/sys/select.h +dns.o: /usr/include/bits/select.h /usr/include/bits/sigset.h +dns.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h +dns.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h +dns.o: /usr/include/sys/wait.h /usr/include/signal.h +dns.o: /usr/include/bits/signum.h /usr/include/bits/siginfo.h +dns.o: /usr/include/bits/sigaction.h /usr/include/bits/sigcontext.h +dns.o: /usr/include/asm/sigcontext.h /usr/include/asm-i486/sigcontext.h +dns.o: /usr/include/linux/compiler.h /usr/include/bits/sigstack.h +dns.o: /usr/include/bits/sigthread.h /usr/include/sys/resource.h +dns.o: /usr/include/bits/resource.h /usr/include/bits/waitflags.h +dns.o: /usr/include/bits/waitstatus.h /usr/include/sys/ipc.h +dns.o: /usr/include/bits/ipctypes.h /usr/include/bits/ipc.h +dns.o: /usr/include/sys/msg.h /usr/include/bits/msq.h ip.o: ipout.h ipaddr.h /usr/include/stdint.h /usr/include/features.h ip.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h ip.o: /usr/include/bits/wchar.h /usr/include/bits/wordsize.h ipheader.h @@ -187,46 +205,16 @@ ipout.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h ipout.o: /usr/include/sys/ipc.h /usr/include/bits/ipctypes.h ipout.o: /usr/include/bits/ipc.h /usr/include/sys/msg.h ipout.o: /usr/include/bits/msq.h -nameserver.o: nameserver.h ipaddr.h /usr/include/stdint.h +nameserver.o: nameserver.h devque.h dev.h ipaddr.h /usr/include/stdint.h nameserver.o: /usr/include/features.h /usr/include/sys/cdefs.h nameserver.o: /usr/include/gnu/stubs.h /usr/include/bits/wchar.h -nameserver.o: /usr/include/bits/wordsize.h resolvproto.h +nameserver.o: /usr/include/bits/wordsize.h resolvproto.h ipin.h ipheader.h +nameserver.o: ipout.h routetable.h resolvproto.o: resolvproto.h ipaddr.h /usr/include/stdint.h resolvproto.o: /usr/include/features.h /usr/include/sys/cdefs.h resolvproto.o: /usr/include/gnu/stubs.h /usr/include/bits/wchar.h -resolvproto.o: /usr/include/bits/wordsize.h libtcp.h /usr/include/stdio.h -resolvproto.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h -resolvproto.o: /usr/include/libio.h /usr/include/_G_config.h -resolvproto.o: /usr/include/wchar.h /usr/include/gconv.h -resolvproto.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h -resolvproto.o: /usr/include/stdlib.h /usr/include/sys/types.h -resolvproto.o: /usr/include/time.h /usr/include/endian.h -resolvproto.o: /usr/include/bits/endian.h /usr/include/sys/select.h -resolvproto.o: /usr/include/bits/select.h /usr/include/bits/sigset.h -resolvproto.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h -resolvproto.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h -resolvproto.o: /usr/include/alloca.h /usr/include/unistd.h -resolvproto.o: /usr/include/bits/posix_opt.h /usr/include/bits/confname.h -resolvproto.o: /usr/include/getopt.h /usr/include/signal.h -resolvproto.o: /usr/include/bits/signum.h /usr/include/bits/siginfo.h -resolvproto.o: /usr/include/bits/sigaction.h /usr/include/bits/sigcontext.h -resolvproto.o: /usr/include/asm/sigcontext.h -resolvproto.o: /usr/include/asm-i486/sigcontext.h -resolvproto.o: /usr/include/linux/compiler.h /usr/include/bits/sigstack.h -resolvproto.o: /usr/include/bits/sigthread.h /usr/include/sys/wait.h -resolvproto.o: /usr/include/sys/resource.h /usr/include/bits/resource.h -resolvproto.o: /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h -resolvproto.o: /usr/include/string.h /usr/include/sys/socket.h -resolvproto.o: /usr/include/sys/uio.h /usr/include/bits/uio.h -resolvproto.o: /usr/include/bits/socket.h /usr/include/limits.h -resolvproto.o: /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h -resolvproto.o: /usr/include/linux/limits.h /usr/include/bits/posix2_lim.h -resolvproto.o: /usr/include/bits/sockaddr.h /usr/include/asm/socket.h -resolvproto.o: /usr/include/asm-i486/socket.h /usr/include/asm/sockios.h -resolvproto.o: /usr/include/asm-i486/sockios.h /usr/include/netinet/in.h -resolvproto.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h -resolvproto.o: /usr/include/arpa/inet.h /usr/include/netdb.h -resolvproto.o: /usr/include/rpc/netdb.h /usr/include/bits/netdb.h +resolvproto.o: /usr/include/bits/wordsize.h ipin.h ipheader.h dev.h ipout.h +resolvproto.o: routetable.h routetable.o: routetable.h dev.h ipaddr.h /usr/include/stdint.h routetable.o: /usr/include/features.h /usr/include/sys/cdefs.h routetable.o: /usr/include/gnu/stubs.h /usr/include/bits/wchar.h @@ -292,16 +280,19 @@ test_ipout.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h test_ipout.o: /usr/include/sys/ipc.h /usr/include/bits/ipctypes.h test_ipout.o: /usr/include/bits/ipc.h /usr/include/sys/msg.h test_ipout.o: /usr/include/bits/msq.h -test_nameserver_file.o: nameserver.h ipaddr.h /usr/include/stdint.h -test_nameserver_file.o: /usr/include/features.h /usr/include/sys/cdefs.h -test_nameserver_file.o: /usr/include/gnu/stubs.h /usr/include/bits/wchar.h -test_nameserver_file.o: /usr/include/bits/wordsize.h resolvproto.h -test_nameserver_resolvnext.o: nameserver.h ipaddr.h /usr/include/stdint.h -test_nameserver_resolvnext.o: /usr/include/features.h +test_nameserver_file.o: nameserver.h devque.h dev.h ipaddr.h +test_nameserver_file.o: /usr/include/stdint.h /usr/include/features.h +test_nameserver_file.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h +test_nameserver_file.o: /usr/include/bits/wchar.h +test_nameserver_file.o: /usr/include/bits/wordsize.h resolvproto.h ipin.h +test_nameserver_file.o: ipheader.h ipout.h routetable.h +test_nameserver_resolvnext.o: nameserver.h devque.h dev.h ipaddr.h +test_nameserver_resolvnext.o: /usr/include/stdint.h /usr/include/features.h test_nameserver_resolvnext.o: /usr/include/sys/cdefs.h test_nameserver_resolvnext.o: /usr/include/gnu/stubs.h test_nameserver_resolvnext.o: /usr/include/bits/wchar.h test_nameserver_resolvnext.o: /usr/include/bits/wordsize.h resolvproto.h +test_nameserver_resolvnext.o: ipin.h ipheader.h ipout.h routetable.h test_recv.o: devque.h dev.h /usr/include/unistd.h /usr/include/features.h test_recv.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h test_recv.o: /usr/include/bits/posix_opt.h /usr/include/bits/types.h @@ -316,14 +307,56 @@ test_recv.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h test_recv.o: /usr/include/bits/sched.h /usr/include/sys/ipc.h test_recv.o: /usr/include/bits/ipctypes.h /usr/include/bits/ipc.h test_recv.o: /usr/include/sys/msg.h /usr/include/bits/msq.h +test_resolvproto.o: resolvproto.h ipaddr.h /usr/include/stdint.h +test_resolvproto.o: /usr/include/features.h /usr/include/sys/cdefs.h +test_resolvproto.o: /usr/include/gnu/stubs.h /usr/include/bits/wchar.h +test_resolvproto.o: /usr/include/bits/wordsize.h ipin.h ipheader.h dev.h +test_resolvproto.o: ipout.h routetable.h libtcp.h /usr/include/stdio.h +test_resolvproto.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h +test_resolvproto.o: /usr/include/libio.h /usr/include/_G_config.h +test_resolvproto.o: /usr/include/wchar.h /usr/include/gconv.h +test_resolvproto.o: /usr/include/bits/stdio_lim.h +test_resolvproto.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h +test_resolvproto.o: /usr/include/sys/types.h /usr/include/time.h +test_resolvproto.o: /usr/include/endian.h /usr/include/bits/endian.h +test_resolvproto.o: /usr/include/sys/select.h /usr/include/bits/select.h +test_resolvproto.o: /usr/include/bits/sigset.h /usr/include/bits/time.h +test_resolvproto.o: /usr/include/sys/sysmacros.h +test_resolvproto.o: /usr/include/bits/pthreadtypes.h +test_resolvproto.o: /usr/include/bits/sched.h /usr/include/alloca.h +test_resolvproto.o: /usr/include/unistd.h /usr/include/bits/posix_opt.h +test_resolvproto.o: /usr/include/bits/confname.h /usr/include/getopt.h +test_resolvproto.o: /usr/include/signal.h /usr/include/bits/signum.h +test_resolvproto.o: /usr/include/bits/siginfo.h /usr/include/bits/sigaction.h +test_resolvproto.o: /usr/include/bits/sigcontext.h +test_resolvproto.o: /usr/include/asm/sigcontext.h +test_resolvproto.o: /usr/include/asm-i486/sigcontext.h +test_resolvproto.o: /usr/include/linux/compiler.h +test_resolvproto.o: /usr/include/bits/sigstack.h +test_resolvproto.o: /usr/include/bits/sigthread.h /usr/include/sys/wait.h +test_resolvproto.o: /usr/include/sys/resource.h /usr/include/bits/resource.h +test_resolvproto.o: /usr/include/bits/waitflags.h +test_resolvproto.o: /usr/include/bits/waitstatus.h /usr/include/string.h +test_resolvproto.o: /usr/include/sys/socket.h /usr/include/sys/uio.h +test_resolvproto.o: /usr/include/bits/uio.h /usr/include/bits/socket.h +test_resolvproto.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h +test_resolvproto.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h +test_resolvproto.o: /usr/include/bits/posix2_lim.h +test_resolvproto.o: /usr/include/bits/sockaddr.h /usr/include/asm/socket.h +test_resolvproto.o: /usr/include/asm-i486/socket.h /usr/include/asm/sockios.h +test_resolvproto.o: /usr/include/asm-i486/sockios.h /usr/include/netinet/in.h +test_resolvproto.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h +test_resolvproto.o: /usr/include/arpa/inet.h /usr/include/netdb.h +test_resolvproto.o: /usr/include/rpc/netdb.h /usr/include/bits/netdb.h test_resolvprotoc.o: resolvproto.h ipaddr.h /usr/include/stdint.h test_resolvprotoc.o: /usr/include/features.h /usr/include/sys/cdefs.h test_resolvprotoc.o: /usr/include/gnu/stubs.h /usr/include/bits/wchar.h -test_resolvprotoc.o: /usr/include/bits/wordsize.h libtcp.h -test_resolvprotoc.o: /usr/include/stdio.h /usr/include/bits/types.h -test_resolvprotoc.o: /usr/include/bits/typesizes.h /usr/include/libio.h -test_resolvprotoc.o: /usr/include/_G_config.h /usr/include/wchar.h -test_resolvprotoc.o: /usr/include/gconv.h /usr/include/bits/stdio_lim.h +test_resolvprotoc.o: /usr/include/bits/wordsize.h ipin.h ipheader.h dev.h +test_resolvprotoc.o: ipout.h routetable.h libtcp.h /usr/include/stdio.h +test_resolvprotoc.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h +test_resolvprotoc.o: /usr/include/libio.h /usr/include/_G_config.h +test_resolvprotoc.o: /usr/include/wchar.h /usr/include/gconv.h +test_resolvprotoc.o: /usr/include/bits/stdio_lim.h test_resolvprotoc.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h test_resolvprotoc.o: /usr/include/sys/types.h /usr/include/time.h test_resolvprotoc.o: /usr/include/endian.h /usr/include/bits/endian.h @@ -360,50 +393,6 @@ test_resolvprotoc.o: /usr/include/netinet/in.h /usr/include/bits/in.h test_resolvprotoc.o: /usr/include/bits/byteswap.h /usr/include/arpa/inet.h test_resolvprotoc.o: /usr/include/netdb.h /usr/include/rpc/netdb.h test_resolvprotoc.o: /usr/include/bits/netdb.h -test_resolvprotos.o: resolvproto.h ipaddr.h /usr/include/stdint.h -test_resolvprotos.o: /usr/include/features.h /usr/include/sys/cdefs.h -test_resolvprotos.o: /usr/include/gnu/stubs.h /usr/include/bits/wchar.h -test_resolvprotos.o: /usr/include/bits/wordsize.h libtcp.h -test_resolvprotos.o: /usr/include/stdio.h /usr/include/bits/types.h -test_resolvprotos.o: /usr/include/bits/typesizes.h /usr/include/libio.h -test_resolvprotos.o: /usr/include/_G_config.h /usr/include/wchar.h -test_resolvprotos.o: /usr/include/gconv.h /usr/include/bits/stdio_lim.h -test_resolvprotos.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h -test_resolvprotos.o: /usr/include/sys/types.h /usr/include/time.h -test_resolvprotos.o: /usr/include/endian.h /usr/include/bits/endian.h -test_resolvprotos.o: /usr/include/sys/select.h /usr/include/bits/select.h -test_resolvprotos.o: /usr/include/bits/sigset.h /usr/include/bits/time.h -test_resolvprotos.o: /usr/include/sys/sysmacros.h -test_resolvprotos.o: /usr/include/bits/pthreadtypes.h -test_resolvprotos.o: /usr/include/bits/sched.h /usr/include/alloca.h -test_resolvprotos.o: /usr/include/unistd.h /usr/include/bits/posix_opt.h -test_resolvprotos.o: /usr/include/bits/confname.h /usr/include/getopt.h -test_resolvprotos.o: /usr/include/signal.h /usr/include/bits/signum.h -test_resolvprotos.o: /usr/include/bits/siginfo.h -test_resolvprotos.o: /usr/include/bits/sigaction.h -test_resolvprotos.o: /usr/include/bits/sigcontext.h -test_resolvprotos.o: /usr/include/asm/sigcontext.h -test_resolvprotos.o: /usr/include/asm-i486/sigcontext.h -test_resolvprotos.o: /usr/include/linux/compiler.h -test_resolvprotos.o: /usr/include/bits/sigstack.h -test_resolvprotos.o: /usr/include/bits/sigthread.h /usr/include/sys/wait.h -test_resolvprotos.o: /usr/include/sys/resource.h /usr/include/bits/resource.h -test_resolvprotos.o: /usr/include/bits/waitflags.h -test_resolvprotos.o: /usr/include/bits/waitstatus.h /usr/include/string.h -test_resolvprotos.o: /usr/include/sys/socket.h /usr/include/sys/uio.h -test_resolvprotos.o: /usr/include/bits/uio.h /usr/include/bits/socket.h -test_resolvprotos.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h -test_resolvprotos.o: /usr/include/bits/local_lim.h -test_resolvprotos.o: /usr/include/linux/limits.h -test_resolvprotos.o: /usr/include/bits/posix2_lim.h -test_resolvprotos.o: /usr/include/bits/sockaddr.h /usr/include/asm/socket.h -test_resolvprotos.o: /usr/include/asm-i486/socket.h -test_resolvprotos.o: /usr/include/asm/sockios.h -test_resolvprotos.o: /usr/include/asm-i486/sockios.h -test_resolvprotos.o: /usr/include/netinet/in.h /usr/include/bits/in.h -test_resolvprotos.o: /usr/include/bits/byteswap.h /usr/include/arpa/inet.h -test_resolvprotos.o: /usr/include/netdb.h /usr/include/rpc/netdb.h -test_resolvprotos.o: /usr/include/bits/netdb.h test_send.o: devque.h dev.h /usr/include/unistd.h /usr/include/features.h test_send.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h test_send.o: /usr/include/bits/posix_opt.h /usr/include/bits/types.h diff --git a/practicas/pipi/src/resolvproto.cpp b/practicas/pipi/src/resolvproto.cpp index 4c45f69..55e960c 100644 --- a/practicas/pipi/src/resolvproto.cpp +++ b/practicas/pipi/src/resolvproto.cpp @@ -1,50 +1,35 @@ #include "resolvproto.h" -#include "libtcp.h" #include #include #include -/// Constructor -ResolvProtoRequest::ResolvProtoRequest(int fd) -{ - recv(fd); -} - /// Constructor ResolvProtoRequest::ResolvProtoRequest(std::string name, uint8_t query_type): query_type(query_type), name(name) {} -/// Envía por socket -void ResolvProtoRequest::send(int sockfd) const - throw (std::runtime_error) +/// Constructor a partir de un buffer +ResolvProtoRequest::ResolvProtoRequest(std::string buf) { - if (libtcp_send(sockfd, &query_type, sizeof(uint8_t)) != sizeof(uint8_t)) - throw std::runtime_error("Error al enviar query_type por socket"); + memcpy(&query_type, buf.c_str(), sizeof(uint8_t)); + uint16_t size; + memcpy(&size, buf.c_str() + sizeof(uint8_t), sizeof(uint16_t)); + name.assign(buf.c_str() + sizeof(uint8_t) + sizeof(uint16_t), size); +} + +/// Convierte a un buffer +ResolvProtoRequest::operator std::string () const +{ + std::string buf((char*)&query_type, sizeof(uint8_t)); uint16_t size = name.size(); - if (libtcp_send(sockfd, &size, sizeof(uint16_t)) != sizeof(uint16_t)) - throw std::runtime_error("Error al enviar size por socket"); - if (libtcp_send(sockfd, name.c_str(), size) != size) - throw std::runtime_error("Error al enviar name por socket"); + buf.append((char*)&size, sizeof(uint16_t)); + buf.append(name); + return buf; } -/// Recibe por socket -void ResolvProtoRequest::recv(int sockfd) - throw (std::runtime_error) +size_t ResolvProtoRequest::packet_size() const { - if (libtcp_receive_bin(sockfd, &query_type, sizeof(uint8_t)) != sizeof(uint8_t)) - throw std::runtime_error("Error al recibir query_type por socket"); - uint16_t size; - if (libtcp_receive_bin(sockfd, &size, sizeof(uint16_t)) != sizeof(uint16_t)) - throw std::runtime_error("Error al recibir size por socket"); - char* buf = (char*) malloc(size); - if (libtcp_receive_bin(sockfd, buf, size) != size) - { - free(buf); - throw std::runtime_error("Error al recibir name por socket"); - } - name.assign(buf, size); - free(buf); + return sizeof(uint8_t) + sizeof(uint16_t) + name.size(); } /// Impresión de request @@ -60,9 +45,21 @@ ResolvProtoResponse::ResolvProtoResponse(): ret(R_NOTFOUND), ttl(0) } /// Constructor -ResolvProtoResponse::ResolvProtoResponse(int fd) +ResolvProtoResponse::ResolvProtoResponse(std::string buf) { - recv(fd); + memcpy(&ret, buf.c_str(), sizeof(uint8_t)); + memcpy(&ttl, buf.c_str() + sizeof(uint8_t), sizeof(uint32_t)); + uint8_t count; + memcpy(&count, buf.c_str() + sizeof(uint8_t) + sizeof(uint32_t), + sizeof(uint8_t)); + ips.reserve(count); + for (uint8_t i = 0; i < count; ++i) + { + uint32_t ip; + memcpy(&ip, buf.c_str() + 2 * sizeof(uint8_t) + + sizeof(uint32_t) * (i + 1), sizeof(uint32_t)); + ips.push_back(ip); + } } /// Constructor @@ -71,45 +68,24 @@ ResolvProtoResponse::ResolvProtoResponse(ret_t ret, uint32_t ttl, ret(ret), ttl(ttl), ips(ips) {} -/// Envía por socket -void ResolvProtoResponse::send(int sockfd) const - throw (std::runtime_error) +/// Convierte a buffer +ResolvProtoResponse::operator std::string () const { - if (libtcp_send(sockfd, &ret, sizeof(uint8_t)) != sizeof(uint8_t)) - throw std::runtime_error("Error al enviar ret por socket"); - if (libtcp_send(sockfd, &ttl, sizeof(uint32_t)) != sizeof(uint32_t)) - throw std::runtime_error("Error al enviar ttl por socket"); + std::string buf((char*)&ret, sizeof(uint8_t)); + buf.append((char*)&ttl, sizeof(uint32_t)); uint8_t count = ips.size(); - if (libtcp_send(sockfd, &count, sizeof(uint8_t)) != sizeof(uint8_t)) - throw std::runtime_error("Error al enviar count por socket"); + buf.append((char*)&count, sizeof(uint8_t)); for (ipvec_t::const_iterator i = ips.begin(); i != ips.end(); ++i) { uint32_t ip = *i; - if (libtcp_send(sockfd, &ip, sizeof(uint32_t)) != sizeof(uint32_t)) - throw std::runtime_error("Error al enviar IPAddr por socket"); + buf.append((char*)&ip, sizeof(uint32_t)); } + return buf; } -/// Recibe por socket -void ResolvProtoResponse::recv(int sockfd) - throw (std::runtime_error) +size_t ResolvProtoResponse::packet_size() const { - if (libtcp_receive_bin(sockfd, &ret, sizeof(uint8_t)) != sizeof(uint8_t)) - throw std::runtime_error("Error al recibir ret por socket"); - if (libtcp_receive_bin(sockfd, &ttl, sizeof(uint32_t)) != sizeof(uint32_t)) - throw std::runtime_error("Error al recibir ttl por socket"); - uint8_t count; - if (libtcp_receive_bin(sockfd, &count, sizeof(uint8_t)) != sizeof(uint8_t)) - throw std::runtime_error("Error al recibir count por socket"); - ips.clear(); - ips.reserve(count); - for (uint8_t i = 0; i < count; ++i) - { - uint32_t ip; - if (libtcp_receive_bin(sockfd, &ip, sizeof(uint32_t)) != sizeof(uint32_t)) - throw std::runtime_error("Error al recibir IPAddr por socket"); - ips.push_back(ip); - } + return 2 * sizeof(uint8_t) + (ips.size() + 1) * sizeof(uint32_t); } /// Impresión de response diff --git a/practicas/pipi/src/resolvproto.h b/practicas/pipi/src/resolvproto.h index ab41bf9..50ec171 100644 --- a/practicas/pipi/src/resolvproto.h +++ b/practicas/pipi/src/resolvproto.h @@ -2,6 +2,8 @@ #define _RESOLVPROTO_H_ #include "ipaddr.h" +#include "ipin.h" +#include "ipout.h" #include #include #include @@ -27,14 +29,20 @@ struct ResolvProtoRequest std::string name; /// Constructores - ResolvProtoRequest(int fd); - ResolvProtoRequest(std::string name, uint8_t query_type = QT_RECURSIVE); + ResolvProtoRequest(std::string name, uint8_t query_type); + ResolvProtoRequest(std::string buf); /// Envía por socket - void send(int sockfd) const throw (std::runtime_error); + void send(IPOut& ipo) const throw (std::runtime_error); /// Recibe por socket - void recv(int sockfd) throw (std::runtime_error); + void recv(IPIn& ipi) throw (std::runtime_error); + + /// Obtiene tamaño del paquete + size_t packet_size() const; + + /// Convierte a un string + operator std::string () const; }; @@ -69,15 +77,21 @@ struct ResolvProtoResponse /// Constructores ResolvProtoResponse(); - ResolvProtoResponse(int fd); ResolvProtoResponse(ret_t ret, uint32_t ttl = 0, const ipvec_t& ips = ipvec_t()); + ResolvProtoResponse(std::string buf); /// Envía por socket - void send(int sockfd) const throw (std::runtime_error); + void send(IPOut& ipo) const throw (std::runtime_error); /// Recibe por socket - void recv(int sockfd) throw (std::runtime_error); + void recv(IPIn& ipi) throw (std::runtime_error); + + /// Obtiene tamaño del paquete + size_t packet_size() const; + + /// Convierte a un string + operator std::string () const; }; diff --git a/practicas/pipi/src/test_resolvproto.cpp b/practicas/pipi/src/test_resolvproto.cpp new file mode 100644 index 0000000..ba1c136 --- /dev/null +++ b/practicas/pipi/src/test_resolvproto.cpp @@ -0,0 +1,23 @@ + +#include "resolvproto.h" +#include "libtcp.h" +#include +#include + +int main() +{ + ResolvProtoRequest req("hola.tito", ResolvProtoRequest::QT_RECURSIVE); + std::cout << "Request Original: " << req << "\n"; + ResolvProtoRequest req2 = std::string(req); + std::cout << "Request Reconstruido: " << req2 << "\n"; + ResolvProtoResponse res(ResolvProtoResponse::R_A, 600); + res.ips.push_back(IPAddr("10.10.10.2")); + res.ips.push_back(IPAddr("100.20.45.21")); + res.ips.push_back(IPAddr("230.23.62.189")); + std::cout << "Response Original: " << res << "\n"; + ResolvProtoResponse res2 = std::string(res); + std::cout << "Response Reconstruido: " << res2 << "\n"; + return 0; +} + +// vim: set et sw=4 sts=4 : diff --git a/practicas/pipi/src/test_resolvprotoc.cpp b/practicas/pipi/src/test_resolvprotoc.cpp deleted file mode 100644 index 4f04686..0000000 --- a/practicas/pipi/src/test_resolvprotoc.cpp +++ /dev/null @@ -1,19 +0,0 @@ - -#include "resolvproto.h" -#include "libtcp.h" -#include -#include - -int main() -{ - int fd = libtcp_open_activo("localhost", 5050); assert(fd != -1); - ResolvProtoRequest rpr("hola.mundo.cruel"); - std::cout << "Vamos a enviar: " << rpr << "\n"; - rpr.send(fd); - ResolvProtoResponse rps(fd); - std::cout << "Recibimos: " << rps << "\n"; - close(fd); - return 0; -} - -// vim: set et sw=4 sts=4 : diff --git a/practicas/pipi/src/test_resolvprotos.cpp b/practicas/pipi/src/test_resolvprotos.cpp deleted file mode 100644 index 54c8c10..0000000 --- a/practicas/pipi/src/test_resolvprotos.cpp +++ /dev/null @@ -1,24 +0,0 @@ - -#include "resolvproto.h" -#include "libtcp.h" -#include -#include - -int main() -{ - int sfd = libtcp_open_pasivo(5050); assert(sfd != -1); - int cfd = accept(sfd, NULL, NULL); assert(cfd != -1); - close(sfd); - ResolvProtoRequest rpr(cfd); - std::cout << "Recibimos: " << rpr << "\n"; - ResolvProtoResponse rps(ResolvProtoResponse::R_A, 600); - rps.ips.push_back(IPAddr("10.10.10.2")); - rps.ips.push_back(IPAddr("100.20.45.21")); - rps.ips.push_back(IPAddr("230.23.62.189")); - std::cout << "Contestamos: " << rps << "\n"; - rps.send(cfd); - close(cfd); - return 0; -} - -// vim: set et sw=4 sts=4 :