status_t socket_set_max_backlog(net_socket *_socket, uint32 backlog) { net_socket_private *socket = (net_socket_private *)_socket; // we enforce an upper limit of connections waiting to be accepted if (backlog > 256) backlog = 256; mutex_lock(&socket->lock); // first remove the pending connections, then the already connected ones as needed net_socket *child; while (socket->child_count > backlog && (child = (net_socket *)list_remove_tail_item(&socket->pending_children)) != NULL) { child->parent = NULL; socket->child_count--; } while (socket->child_count > backlog && (child = (net_socket *)list_remove_tail_item(&socket->connected_children)) != NULL) { child->parent = NULL; socket_delete(child); socket->child_count--; } socket->max_backlog = backlog; mutex_unlock(&socket->lock); return B_OK; }
net_protocol* init_protocol(net_socket** _socket) { net_socket *socket; status_t status = socket_create(AF_INET, SOCK_STREAM, IPPROTO_TCP, &socket); if (status < B_OK) return NULL; status = socket->first_info->open(socket->first_protocol); if (status < B_OK) { fprintf(stderr, "tcp_tester: cannot open client: %s\n", strerror(status)); socket_delete(socket); return NULL; } *_socket = socket; return socket->first_protocol; }
bool socket_remove(NetworkInterface* ni, uint32_t ip, uint16_t port) { Map* sockets = ni_config_get(ni, SOCKETS); if(!sockets) return false; uint64_t key = (uint64_t)ip << 32 | (uint64_t)port; Socket* socket = map_remove(sockets, (void*)key); if(!socket) return false; socket_delete(ni, socket); if(map_is_empty(sockets)) { map_destroy(sockets); ni_config_remove(ni, SOCKETS); } return true; }
int zsp_listener_stop(zsp_listener_t *listener) { if (listener == NULL) return SSS_ERROR; if (listener->sock != NULL) { socket_shutdown(listener->sock); socket_delete(listener->sock); listener->sock = NULL; } if (listener->thread != NULL) { thread_stop(listener->thread); thread_delete(listener->thread); listener->thread = NULL; } listener->port = 0; return SSS_OK; }
int main() { memset(&global_param, 0, sizeof(global_param)); global_param.session = -1; socket_init(); socket_new(&global_param.sock, SOCKET_TCP_TYPE); socket_connect(global_param.sock, "127.0.0.1", 1120); do { if (comm_to_server(ZSP_CMD_HELLO, NULL, 0, NULL, NULL) == SSS_ERROR) break; const char *filename = "E:/a.txt"; char *resp_buf = NULL; int resp_len = 0; if (comm_to_server(ZSP_CMD_PLAY, filename, strlen(filename) + 1, &resp_buf, &resp_len) == SSS_ERROR) break; char *file_size_str = "file_size:"; char *p = strstr(resp_buf, file_size_str); p += strlen(file_size_str); long file_len = atol(p); if (p <= 0) break; recv_file_from_server(file_len); if (comm_to_server(ZSP_CMD_BYE, NULL, 0, NULL, NULL) == SSS_ERROR) break; } while (0); socket_delete(global_param.sock); socket_fini(); system("pause"); return 0; }