void send_packet(packet_t *pkt) { int packet_len = 0; #ifdef DEBUG if (pkt->datalen == 0) { int num_bytes = sprintf(pkt->data, "== ack %d : rwinsz %d ==", pkt->ack, pkt->rwinsz); packet_len = PACKET_HEADER_SZ + num_bytes; } else { packet_len = PACKET_SZ; } #else if (pkt->datalen == 0) { packet_len = PACKET_HEADER_SZ; } else { packet_len = PACKET_SZ; } #endif packet_t tp = *pkt; packet_hton(&tp, pkt); #ifdef DEBUG int r; if (rwindow_received_all(&rwin)) { r = perhaps_rarely_send(sockfd, (void *)&tp, packet_len, 0); } else { r = perhaps_send(sockfd, (void *)&tp, packet_len, 0); } #else int r = perhaps_send(sockfd, (void *)&tp, packet_len, 0); #endif if (r < 0 && errno == EINTR) { return; } else if (r < 0) { perror("send"); exit(1); } }
int ndSendData(netObject netObj, char *data, int dataLen, int flag) { int ret = 0 ; nd_packhdr_t *msghdr = (nd_packhdr_t *) data ; ND_USERMSG_SYS_RESERVED(msghdr) = 0 ; packet_ntoh(&msghdr) ; ret = nd_connector_send((nd_handle) netObj, (nd_packhdr_t *)data, flag) ; packet_hton(&msghdr) ; if (-1 == ret && NDERR_WOULD_BLOCK != nd_object_lasterror((nd_handle)netObj)) { tryto_terminate(netObj) ; } return ret ; }
int send_packet(int peer_id, int type, int seq, int ack, char* body, int body_len) { DPRINTF(DEBUG_SOCKETS, "send packet to peer:%d type:%d seq:%d ack:%d body_len:%d\n", peer_id, type, seq, ack, body_len); struct io_peer *peer = NULL; HASH_FIND(hh_id, peers_id, &peer_id, sizeof(int), peer); if (peer == NULL) { fprintf(stderr, "Unknown peer id %d\n", peer_id); return -1; } char data[sizeof(struct packet_header) + body_len]; struct packet_header *header = (struct packet_header *) data; header->magic = PACKET_MAGIC; header->version = PACKET_VERSION; header->header_len = sizeof(struct packet_header); header->total_len = (uint16_t) (header->header_len + body_len); header->type = (unsigned int) type; header->seq = (unsigned int) seq; header->ack = (unsigned int) ack; if (header->type == PACKET_ACK) { --header->ack; } packet_hton(header); if (body && body_len) { memcpy(data + sizeof(struct packet_header), body, (size_t) body_len); } int ret = spiffy_sendto(peer_sockfd, data, sizeof(data), MSG_NOSIGNAL, (const struct sockaddr *) &peer->addr, sizeof(struct sockaddr_in)); if (ret == -1) { DEBUG_PERROR("Cannot send packet\n"); } return ret; }