wangzhengquan
2021-02-04 803d392aeb11665a3e34f7be83f972a1fc7d39c0
src/socket/shm_socket.cpp
@@ -153,11 +153,14 @@
  int rv;
 
  shm_packet_t sendpak;
  shm_packet_t sendpak = {0};
  sendpak.key = sockt->key;
  sendpak.size = size;
  sendpak.buf = mm_malloc(size);
  memcpy(sendpak.buf, buf, size);
  if(buf != NULL) {
    sendpak.buf = mm_malloc(size);
    memcpy(sendpak.buf, buf, size);
  }
  rv = shm_sendpakto(sockt, &sendpak, key, timeout, flag);
  return rv;
}
@@ -176,8 +179,10 @@
  
  sendpak.key = sockt->key;
  sendpak.size = send_size;
  sendpak.buf = mm_malloc(send_size);
  memcpy(sendpak.buf, send_buf, send_size);
  if(send_buf != NULL) {
    sendpak.buf = mm_malloc(send_size);
    memcpy(sendpak.buf, send_buf, send_size);
  }
  memcpy(sendpak.uuid, uuid.c_str(), uuid.length() + 1);
  // uuid.copy(sendpak.uuid, sizeof sendpak.uuid);
  rv = shm_sendpakto(sockt, &sendpak, key, timeout, flags);
@@ -186,7 +191,7 @@
    return rv;
  }
  while(true) {
  while(tryn > 0) {
    tryn--;
    recvbufIter = sockt->recvbuf.find(uuid);
    if(recvbufIter != sockt->recvbuf.end()) {
@@ -194,36 +199,37 @@
logger->debug("get from recvbuf: %s", uuid.c_str());
      recvpak = recvbufIter->second;
      sockt->recvbuf.erase(recvbufIter);
      break;
      goto LABLE_SUC;
    }
    rv = shm_recvpakfrom(sockt, &recvpak, timeout, flags);
    if (rv != 0) {
      if(rv == ETIMEDOUT)
      if(rv == ETIMEDOUT) {
        return EBUS_TIMEOUT;
      }
      logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv));
      return rv;
    } 
logger->debug("send uuid:%s, recv uuid: %s", uuid.c_str(), recvpak.uuid);
    if (strncmp(uuid.c_str(), recvpak.uuid, sizeof recvpak.uuid) == 0) {
    if(strlen(recvpak.uuid) == 0) {
      continue;
    } else if (strncmp(uuid.c_str(), recvpak.uuid, sizeof recvpak.uuid) == 0) {
      // 发送与接受的UUID匹配成功
      break;
      goto LABLE_SUC;
    } else {
      // 答非所问,放到缓存里
      sockt->recvbuf.insert({recvpak.uuid, recvpak});
      continue;
    }
    if(tryn == 0) {
      // 尝试了tryn次都没有成功
      return EBUS_RECVFROM_WRONG_END;
    }
  }
LABLE_FAIL:
  return EBUS_RECVFROM_WRONG_END;
  // return rv;
 
LABLE_SUC:
 if(recv_buf != NULL) {
@@ -239,58 +245,55 @@
  return 0;
}
/**
 * @callback  void (*recv_callback_fn)(void **sendbuf, int *sendsize)
 * @callback  void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize)
 *            sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示发送数据,和发送数据的大小。
 * 
 */
int shm_recvandsend(shm_socket_t *sockt, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback,
  const struct timespec *timeout, int flag) {
int shm_recvandsend(shm_socket_t *sockt,  recvandsend_callback_fn callback,
  const struct timespec *timeout, int flag, void *user_data) {
  
  int rv;
 
  void *sendbuf = NULL;
  void *sendbuf, *recvbuf = NULL;
  int sendsize = 0;
  shm_packet_t recvpak;
  shm_packet_t recvpak = {0};
  rv = shm_recvpakfrom(sockt , &recvpak, timeout, flag);
  if (rv != 0) {
    if(rv == ETIMEDOUT)
    if(rv == ETIMEDOUT){
      logger->debug("%d shm_recvandsend failed %s", shm_socket_get_key(sockt), bus_strerror(EBUS_TIMEOUT));
      return EBUS_TIMEOUT;
    else {
      logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv));
      return rv;
    }
    logger->error("%d shm_recvandsend failed %s", shm_socket_get_key(sockt), bus_strerror(rv));
    return rv;
  }
   
  if(recvbuf != NULL) {
    void *_buf = malloc(recvpak.size);
    memcpy(_buf, recvpak.buf, recvpak.size);
    *recvbuf = _buf;
  if(recvpak.buf != NULL) {
    recvbuf = malloc(recvpak.size);
    memcpy(recvbuf, recvpak.buf, recvpak.size);
    mm_free(recvpak.buf);
  }
 
  if(recvsize != NULL)
    *recvsize = recvpak.size;
  callback(recvbuf, recvpak.size, recvpak.key, &sendbuf, &sendsize, user_data);
  if(key != NULL)
    *key = recvpak.key;
  mm_free(recvpak.buf);
  callback(&sendbuf, &sendsize);
  shm_packet_t sendpak;
  shm_packet_t sendpak = {0};
  sendpak.key = sockt->key;
  sendpak.size = sendsize;
  memcpy(sendpak.uuid, recvpak.uuid, sizeof sendpak.uuid);
  if(sendbuf !=NULL && sendsize > 0) {
    sendpak.buf = mm_malloc(sendsize);
    memcpy(sendpak.buf, sendbuf, sendsize);
  } else {
    logger->warn("%d shm_recvandsend : sendbuf is null", shm_socket_get_key(sockt));
    // return -1;
  }
 
  rv = shm_sendpakto(sockt, &sendpak, recvpak.key, timeout, flag);
@@ -318,7 +321,7 @@
  } 
 if(buf != NULL) {
 if(buf != NULL && recvpak.buf != NULL) {
    void *_buf = malloc(recvpak.size);
    memcpy(_buf, recvpak.buf, recvpak.size);
    *buf = _buf; 
@@ -555,6 +558,7 @@
LABEL_POP:
 
  printf("%p start recv.....\n", sockt);
 
  rv = sockt->queue->pop(*recvpak, timeout, flag);