mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
Send tcp buffers using writev.
git-svn-id: file:///svn/unbound/trunk@284 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
60884c3320
commit
d4d4ba78e0
2 changed files with 14 additions and 8 deletions
|
|
@ -6,6 +6,8 @@
|
||||||
- alloc cache special_release() locks if necessary.
|
- alloc cache special_release() locks if necessary.
|
||||||
- rrset trustworthiness type added.
|
- rrset trustworthiness type added.
|
||||||
- thread keeps a scratchpad region for handling messages.
|
- thread keeps a scratchpad region for handling messages.
|
||||||
|
- writev used in netevent to write tcp length and data after another.
|
||||||
|
This saves a roundtrip on tcp replies.
|
||||||
|
|
||||||
3 May 2007: Wouter
|
3 May 2007: Wouter
|
||||||
- fill refs. Use new parse and encode to answer queries.
|
- fill refs. Use new parse and encode to answer queries.
|
||||||
|
|
|
||||||
|
|
@ -436,30 +436,34 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
|
||||||
|
|
||||||
if(c->tcp_byte_count < sizeof(uint16_t)) {
|
if(c->tcp_byte_count < sizeof(uint16_t)) {
|
||||||
uint16_t len = htons(ldns_buffer_limit(c->buffer));
|
uint16_t len = htons(ldns_buffer_limit(c->buffer));
|
||||||
/*
|
|
||||||
struct iovec iov[2];
|
struct iovec iov[2];
|
||||||
iov[0].iov_base = (uint8_t*)&len + c->tcp_byte_count;
|
iov[0].iov_base = (uint8_t*)&len + c->tcp_byte_count;
|
||||||
iov[0].iov_len = sizeof(uint16_t) - c->tcp_byte_count;
|
iov[0].iov_len = sizeof(uint16_t) - c->tcp_byte_count;
|
||||||
*/
|
iov[1].iov_base = ldns_buffer_begin(c->buffer);
|
||||||
r = write(fd, (uint8_t*)&len + c->tcp_byte_count,
|
iov[1].iov_len = ldns_buffer_limit(c->buffer);
|
||||||
sizeof(uint16_t) - c->tcp_byte_count);
|
r = writev(fd, iov, 2);
|
||||||
if(r == -1) {
|
if(r == -1) {
|
||||||
if(errno == EINTR || errno == EAGAIN)
|
if(errno == EINTR || errno == EAGAIN)
|
||||||
return 1;
|
return 1;
|
||||||
log_err("tcp write(s): %s", strerror(errno));
|
log_err("tcp writev: %s", strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
c->tcp_byte_count += r;
|
c->tcp_byte_count += r;
|
||||||
if(c->tcp_byte_count != sizeof(uint16_t))
|
if(c->tcp_byte_count < sizeof(uint16_t))
|
||||||
return 1;
|
return 1;
|
||||||
ldns_buffer_set_position(c->buffer, 0);
|
ldns_buffer_set_position(c->buffer, c->tcp_byte_count -
|
||||||
|
sizeof(uint16_t));
|
||||||
|
if(ldns_buffer_remaining(c->buffer) == 0) {
|
||||||
|
tcp_callback_writer(c);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
r = write(fd, ldns_buffer_current(c->buffer),
|
r = write(fd, ldns_buffer_current(c->buffer),
|
||||||
ldns_buffer_remaining(c->buffer));
|
ldns_buffer_remaining(c->buffer));
|
||||||
if(r == -1) {
|
if(r == -1) {
|
||||||
if(errno == EINTR || errno == EAGAIN)
|
if(errno == EINTR || errno == EAGAIN)
|
||||||
return 1;
|
return 1;
|
||||||
log_err("tcp write(w): %s", strerror(errno));
|
log_err("tcp write: %s", strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ldns_buffer_skip(c->buffer, r);
|
ldns_buffer_skip(c->buffer, r);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue