| | |
| | | |
| | | int _shm_close_stream_socket(shm_socket_t *socket, bool notifyRemote); |
| | | |
| | | static inline int _shm_socket_check_key(shm_socket_t *socket) { |
| | | void *tmp_ptr = mm_get_by_key(socket->port); |
| | | if (tmp_ptr!= NULL && tmp_ptr != (void *)1 && !socket->force_bind ) { |
| | | err_exit(0, "key %d has already been in used!", socket->port); |
| | | return 0; |
| | | } |
| | | return 1; |
| | | } |
| | | |
| | | SHMQueue<shm_msg_t> *_attach_remote_queue(int port); |
| | | |
| | | shm_socket_t *shm_open_socket(shm_socket_type_t socket_type) { |
| | | shm_socket_t *socket = (shm_socket_t *)calloc(1, sizeof(shm_socket_t)); |
| | | socket->socket_type = socket_type; |
| | | socket->port = -1; |
| | | socket->force_bind = false; |
| | | socket->dispatch_thread = 0; |
| | | socket->status = SHM_CONN_CLOSED; |
| | | |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int shm_socket_force_bind(shm_socket_t *socket, int port) { |
| | | socket->force_bind = true; |
| | | socket->port = port; |
| | | return 0; |
| | | } |
| | | |
| | | int shm_listen(shm_socket_t *socket) { |
| | | |
| | | if (socket->socket_type != SHM_SOCKET_STREAM) { |
| | |
| | | socket->port = port; |
| | | } else { |
| | | |
| | | if (hashtable_get(hashtable, socket->port) != NULL) { |
| | | err_exit(0, "key %d has already been in used!", socket->port); |
| | | } |
| | | _shm_socket_check_key(socket); |
| | | } |
| | | |
| | | socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16); |
| | |
| | | return NULL; |
| | | } |
| | | |
| | | |
| | | int shm_connect(shm_socket_t *socket, int port) { |
| | | if (socket->socket_type != SHM_SOCKET_STREAM) { |
| | | err_exit(0, "can not invoke shm_connect method with a socket which is not " |
| | |
| | | if (socket->port == -1) { |
| | | socket->port = hashtable_alloc_key(hashtable); |
| | | } else { |
| | | |
| | | if (hashtable_get(hashtable, socket->port) != NULL) { |
| | | err_exit(0, "key %d has already been in used!", socket->port); |
| | | } |
| | | _shm_socket_check_key(socket); |
| | | } |
| | | |
| | | socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16); |
| | |
| | | socket->port = hashtable_alloc_key(hashtable); |
| | | } else { |
| | | |
| | | if (hashtable_get(hashtable, socket->port) != NULL) { |
| | | err_exit(0, "key %d has already been in used!", socket->port); |
| | | } |
| | | _shm_socket_check_key(socket); |
| | | } |
| | | |
| | | socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16); |
| | |
| | | socket->port = hashtable_alloc_key(hashtable); |
| | | } else { |
| | | |
| | | if (hashtable_get(hashtable, socket->port) != NULL) { |
| | | err_exit(0, "key %d has already been in used!", socket->port); |
| | | } |
| | | _shm_socket_check_key(socket); |
| | | } |
| | | |
| | | socket->queue = new SHMQueue<shm_msg_t>(socket->port, 16); |
| | |
| | | } |
| | | return -1; |
| | | } |
| | | |
| | | // ============================================================================================================ |
| | | |
| | | /** |
| | | * 绑定key到队列,但是并不会创建队列。如果没有对应指定key的队列提示错误并退出 |
| | |
| | | |
| | | delete client_socket->messageQueue; |
| | | client_socket->messageQueue = NULL; |
| | | socket->clientSocketMap->erase(iter); |
| | | free((void *)client_socket); |
| | | } |
| | | delete socket->clientSocketMap; |