From da188550ca4b16d1f49b0e59938ff93612a6cdbb Mon Sep 17 00:00:00 2001 From: Adrian Bondrescu Date: Sun, 15 Jul 2012 14:47:00 +0300 Subject: [PATCH] First step for using multiple recvs from mptp. --- src/libswift/channel.cpp | 29 ++++++++++++++++++----------- src/libswift/sendrecv.cpp | 4 ++-- src/libswift/swift.h | 2 +- src/libswift/tests/dgramtest.cpp | 4 ++-- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/libswift/channel.cpp b/src/libswift/channel.cpp index ef30add..e06d83f 100644 --- a/src/libswift/channel.cpp +++ b/src/libswift/channel.cpp @@ -253,29 +253,36 @@ Address swift::BoundAddress(evutil_socket_t sock) { } -int Channel::SendTo (evutil_socket_t sock, const Address& addr, struct evbuffer *evb) { +int Channel::SendTo (evutil_socket_t sock, const Address& addr, struct evbuffer **evb) { - int length = evbuffer_get_length(evb); - int addr_len = sizeof(struct sockaddr_mptp) + addr.addr->count * sizeof(struct mptp_dest); - struct iovec iov[1]; + int count = addr.addr->count; + int addr_len = sizeof(struct sockaddr_mptp) + count * sizeof(struct mptp_dest); + struct iovec iov[count]; + int lengths[count]; struct msghdr msg; memset(&msg, 0, sizeof(msg)); memset(&iov, 0, sizeof(iov)); - iov[0].iov_base = evbuffer_pullup(evb, length); - iov[0].iov_len = length; + for (int i=0; idests[i].bytes); + global_dgrams_up+=count; + for (int i=0; i 0) raw_bytes_up_ += ret; evbuffer_add_32be(evb, peer_channel_id_); diff --git a/src/libswift/swift.h b/src/libswift/swift.h index 7c8d27c..723cf15 100644 --- a/src/libswift/swift.h +++ b/src/libswift/swift.h @@ -495,7 +495,7 @@ namespace swift { static void LibeventReceiveCallback(int fd, short event, void *arg); static void RecvDatagram (evutil_socket_t socket); // Called by LibeventReceiveCallback static int RecvFrom(evutil_socket_t sock, Address& addr, struct evbuffer **evb); // Called by RecvDatagram - static int SendTo(evutil_socket_t sock, const Address& addr, struct evbuffer *evb); // Called by Channel::Send() + static int SendTo(evutil_socket_t sock, const Address& addr, struct evbuffer **evb); // Called by Channel::Send() static evutil_socket_t Bind(Address address, sckrwecb_t callbacks=sckrwecb_t()); static Address BoundAddress(evutil_socket_t sock); static evutil_socket_t default_socket() diff --git a/src/libswift/tests/dgramtest.cpp b/src/libswift/tests/dgramtest.cpp index 1e12576..48d1107 100644 --- a/src/libswift/tests/dgramtest.cpp +++ b/src/libswift/tests/dgramtest.cpp @@ -55,7 +55,7 @@ TEST(Datagram, BinaryTest) { sprintf(buf+i*2,"%02x",*(data+i)); buf[i*2] = 0; EXPECT_STREQ("74657874ababcdabcdef01000abcdefabcdeff",buf); - ASSERT_EQ(datalen,Channel::SendTo(socket, addr, snd)); + ASSERT_EQ(datalen,Channel::SendTo(socket, addr, &snd)); evbuffer_free(snd); event_assign(&evrecv, evbase, socket, EV_READ, ReceiveCallback, NULL); event_add(&evrecv, NULL); @@ -92,7 +92,7 @@ TEST(Datagram,TwoPortTest) { addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK);*/ struct evbuffer *snd = evbuffer_new(); evbuffer_add_32be(snd, 1234); - Channel::SendTo(sock1,Address("127.0.0.1:10002"),snd); + Channel::SendTo(sock1,Address("127.0.0.1:10002"),&snd); evbuffer_free(snd); event_assign(&evrecv, evbase, sock2, EV_READ, ReceiveCallback, NULL); event_add(&evrecv, NULL); -- 2.20.1