mirror of
https://github.com/NLnetLabs/unbound.git
synced 2024-09-21 22:57:08 +00: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
@ -6,6 +6,8 @@
|
||||
- alloc cache special_release() locks if necessary.
|
||||
- rrset trustworthiness type added.
|
||||
- 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
|
||||
- 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)) {
|
||||
uint16_t len = htons(ldns_buffer_limit(c->buffer));
|
||||
/*
|
||||
struct iovec iov[2];
|
||||
iov[0].iov_base = (uint8_t*)&len + c->tcp_byte_count;
|
||||
iov[0].iov_len = sizeof(uint16_t) - c->tcp_byte_count;
|
||||
*/
|
||||
r = write(fd, (uint8_t*)&len + c->tcp_byte_count,
|
||||
sizeof(uint16_t) - c->tcp_byte_count);
|
||||
iov[1].iov_base = ldns_buffer_begin(c->buffer);
|
||||
iov[1].iov_len = ldns_buffer_limit(c->buffer);
|
||||
r = writev(fd, iov, 2);
|
||||
if(r == -1) {
|
||||
if(errno == EINTR || errno == EAGAIN)
|
||||
return 1;
|
||||
log_err("tcp write(s): %s", strerror(errno));
|
||||
log_err("tcp writev: %s", strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
c->tcp_byte_count += r;
|
||||
if(c->tcp_byte_count != sizeof(uint16_t))
|
||||
if(c->tcp_byte_count < sizeof(uint16_t))
|
||||
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),
|
||||
ldns_buffer_remaining(c->buffer));
|
||||
if(r == -1) {
|
||||
if(errno == EINTR || errno == EAGAIN)
|
||||
return 1;
|
||||
log_err("tcp write(w): %s", strerror(errno));
|
||||
log_err("tcp write: %s", strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
ldns_buffer_skip(c->buffer, r);
|
||||
|
Loading…
Reference in New Issue
Block a user