Beispiel #1
0
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);
  }
}
Beispiel #2
0
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 ;
}
Beispiel #3
0
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;
}