diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index 40ef470c..8042b3f5 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -67,11 +67,12 @@ struct write_buffer { char *ptr; size_t sz; bool userobject; - uint8_t udp_address[UDP_ADDRESS_SIZE]; }; -#define SIZEOF_TCPBUFFER (offsetof(struct write_buffer, udp_address[0])) -#define SIZEOF_UDPBUFFER (sizeof(struct write_buffer)) +struct write_buffer_udp { + struct write_buffer buffer; + uint8_t udp_address[UDP_ADDRESS_SIZE]; +}; struct wb_list { struct write_buffer * head; @@ -777,8 +778,9 @@ static int send_list_udp(struct socket_server *ss, struct socket *s, struct wb_list *list, struct socket_message *result) { while (list->head) { struct write_buffer * tmp = list->head; + struct write_buffer_udp * udp = (struct write_buffer_udp *)tmp; union sockaddr_all sa; - socklen_t sasz = udp_socket_address(s, tmp->udp_address, &sa); + socklen_t sasz = udp_socket_address(s, udp->udp_address, &sa); if (sasz == 0) { skynet_error(NULL, "socket-server : udp (%d) type mismatch.", s->id); drop_udp(ss, s, list, tmp); @@ -920,7 +922,7 @@ send_buffer(struct socket_server *ss, struct socket *s, struct socket_lock *l, s return -1; // blocked by direct write, send later. if (s->dw_buffer) { // add direct write buffer before high.head - struct write_buffer * buf = MALLOC(SIZEOF_TCPBUFFER); + struct write_buffer * buf = MALLOC(sizeof(*buf)); struct send_object so; buf->userobject = send_object_init(ss, &so, (void *)s->dw_buffer, s->dw_size); buf->ptr = (char*)so.buffer+s->dw_offset; @@ -965,20 +967,20 @@ append_sendbuffer_(struct socket_server *ss, struct wb_list *s, struct request_s static inline void append_sendbuffer_udp(struct socket_server *ss, struct socket *s, int priority, struct request_send * request, const uint8_t udp_address[UDP_ADDRESS_SIZE]) { struct wb_list *wl = (priority == PRIORITY_HIGH) ? &s->high : &s->low; - struct write_buffer *buf = append_sendbuffer_(ss, wl, request, SIZEOF_UDPBUFFER); + struct write_buffer_udp *buf = (struct write_buffer_udp *)append_sendbuffer_(ss, wl, request, sizeof(*buf)); memcpy(buf->udp_address, udp_address, UDP_ADDRESS_SIZE); - s->wb_size += buf->sz; + s->wb_size += buf->buffer.sz; } static inline void append_sendbuffer(struct socket_server *ss, struct socket *s, struct request_send * request) { - struct write_buffer *buf = append_sendbuffer_(ss, &s->high, request, SIZEOF_TCPBUFFER); + struct write_buffer *buf = append_sendbuffer_(ss, &s->high, request, sizeof(*buf)); s->wb_size += buf->sz; } static inline void append_sendbuffer_low(struct socket_server *ss,struct socket *s, struct request_send * request) { - struct write_buffer *buf = append_sendbuffer_(ss, &s->low, request, SIZEOF_TCPBUFFER); + struct write_buffer *buf = append_sendbuffer_(ss, &s->low, request, sizeof(*buf)); s->wb_size += buf->sz; } @@ -1749,8 +1751,9 @@ static void send_request(struct socket_server *ss, struct request_package *request, char type, int len) { request->header[6] = (uint8_t)type; request->header[7] = (uint8_t)len; + const char * req = (const char *)request + offsetof(struct request_package, header[6]); for (;;) { - ssize_t n = write(ss->sendctrl_fd, &request->header[6], len+2); + ssize_t n = write(ss->sendctrl_fd, req, len+2); if (n<0) { if (errno != EINTR) { skynet_error(NULL, "socket-server : send ctrl command error %s.", strerror(errno));