📄 tcpmem.cc
字号:
serial_number++; } handle_old_replies(); check_id(timedout_request_writeid); if (status == CMS_READ_OK) { serial_number++; } reenable_sigpipe(); subscription_count++; return status; } if (timedout_request == NO_REMOTE_CMS_REQUEST) { set_socket_fds(read_socket_fd); } if (fatal_error_occurred) { if (status >= 0) { status = CMS_MISC_ERROR; } reenable_sigpipe(); return (status); } if (socket_fd <= 0) { reconnect_needed = 1; rcs_print_error("TCPMEM::read: Invalid socket descriptor. (%d)\n", socket_fd); reenable_sigpipe(); return (status = CMS_MISC_ERROR); } last_timedout_request = timedout_request; if (((int) handle_old_replies()) < 0) { reenable_sigpipe(); return status; } if (polling && last_timedout_request == REMOTE_CMS_READ_REQUEST_TYPE) { check_id(timedout_request_writeid); reenable_sigpipe(); return status; } set_socket_fds(read_socket_fd); *((u_long *) temp_buffer) = htonl((u_long) serial_number); *((u_long *) temp_buffer + 1) = htonl((u_long) REMOTE_CMS_READ_REQUEST_TYPE); *((u_long *) temp_buffer + 2) = htonl((u_long) buffer_number); *((u_long *) temp_buffer + 3) = htonl((u_long) CMS_PEEK_ACCESS); *((u_long *) temp_buffer + 4) = htonl((u_long) in_buffer_id); int send_header_size = 20; if (total_subdivisions > 1) { *((u_long *) temp_buffer + 5) = htonl((u_long) current_subdivision); send_header_size = 24; } if (sendn(socket_fd, temp_buffer, send_header_size, 0, timeout) < 0) { rcs_print_error("TCPMEM: Can't send PEEK request to server.\n"); reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } serial_number++; if (recvn(socket_fd, temp_buffer, 20, 0, timeout, &recvd_bytes) < 0) { if (recvn_timedout) { timedout_request = REMOTE_CMS_READ_REQUEST_TYPE; if (polling) { reenable_sigpipe(); return (status = CMS_READ_OLD); } else { consecutive_timeouts = 1; reenable_sigpipe(); return (status = CMS_TIMED_OUT); } } else { recvd_bytes = 0; fatal_error_occurred = 1; reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } recvd_bytes = 0; returned_serial_number = (CMS_STATUS) ntohl(*((u_long *) temp_buffer)); rcs_print_debug(PRINT_ALL_SOCKET_REQUESTS, "TCPMEM recieved_reply: fd = %d, serial_number=%d, buffer_number=%d\n", socket_fd, returned_serial_number, buffer_number); if (returned_serial_number != serial_number) { rcs_print_error ("TCPMEM: Returned serial number(%d) does not match expected serial number(%d).\n", returned_serial_number, serial_number); reconnect_needed = 1; if (subscription_type == CMS_NO_SUBSCRIPTION) { reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } status = (CMS_STATUS) ntohl(*((u_long *) temp_buffer + 1)); message_size = ntohl(*((u_long *) temp_buffer + 2)); id = ntohl(*((u_long *) temp_buffer + 3)); header.was_read = ntohl(*((u_long *) temp_buffer + 4)); if (message_size > max_encoded_message_size) { reconnect_needed = 1; rcs_print_error("Recieved message is too big. (%ld > %ld)\n", message_size, max_encoded_message_size); reenable_sigpipe(); return (status = CMS_MISC_ERROR); } if (message_size > 0) { if (recvn (socket_fd, encoded_data, message_size, 0, timeout, &recvd_bytes) < 0) { if (recvn_timedout) { if (!waiting_for_message) { waiting_message_id = id; waiting_message_size = message_size; } waiting_for_message = 1; timedout_request = REMOTE_CMS_READ_REQUEST_TYPE; if (polling) { reenable_sigpipe(); return (status = CMS_READ_OLD); } else { reenable_sigpipe(); return (status = CMS_TIMED_OUT); } } else { reconnect_needed = 1; recvd_bytes = 0; fatal_error_occurred = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } } recvd_bytes = 0; check_id(id); reenable_sigpipe(); return (status);}CMS_STATUS TCPMEM::write(void *user_data){ if (!write_permission_flag) { rcs_print_error("CMS: %s was not configured to write to %s\n", ProcessName, BufferName); return (status = CMS_PERMISSIONS_ERROR); } if (reconnect_needed && autoreconnect) { reconnect(); } if (!force_raw) { user_data = encoded_data; } if (reconnect_needed) { return (status = CMS_MISC_ERROR); } if (fatal_error_occurred) { if (status >= 0) { status = CMS_MISC_ERROR; } return (status); } disable_sigpipe(); if (socket_fd <= 0) { rcs_print_error("TCPMEM::write: Invalid socket descriptor. (%d)\n", socket_fd); reenable_sigpipe(); return (status = CMS_MISC_ERROR); } if (((int) handle_old_replies()) < 0) { reenable_sigpipe(); return status; } set_socket_fds(write_socket_fd); *((u_long *) temp_buffer) = htonl((u_long) serial_number); *((u_long *) temp_buffer + 1) = htonl((u_long) REMOTE_CMS_WRITE_REQUEST_TYPE); *((u_long *) temp_buffer + 2) = htonl((u_long) buffer_number); *((u_long *) temp_buffer + 3) = htonl((u_long) CMS_WRITE_ACCESS); *((u_long *) temp_buffer + 4) = htonl((u_long) header.in_buffer_size); int send_header_size = 20; if (total_subdivisions > 1) { *((u_long *) temp_buffer + 5) = htonl((u_long) current_subdivision); send_header_size = 24; } if (header.in_buffer_size < 0x2000 - 20 && header.in_buffer_size > 0) { memcpy(temp_buffer + send_header_size, user_data, header.in_buffer_size); if (sendn (socket_fd, temp_buffer, header.in_buffer_size + send_header_size, 0, timeout) < 0) { rcs_print_error ("TCPMEM: Failed to send message of size %d + header of size %d to the server.\n", header.in_buffer_size, send_header_size); reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } else { if (sendn(socket_fd, temp_buffer, send_header_size, 0, timeout) < 0) { rcs_print_error("TCPMEM: Failed to send header to server.\n"); reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } if (header.in_buffer_size > 0) { if (sendn(socket_fd, user_data, header.in_buffer_size, 0, timeout) < 0) { reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } } serial_number++; if ((min_compatible_version < 2.58 && min_compatible_version > 1e-6) || confirm_write) { if (recvn(socket_fd, temp_buffer, 12, 0, timeout, &recvd_bytes) < 0) { if (recvn_timedout) { timedout_request = REMOTE_CMS_WRITE_REQUEST_TYPE; consecutive_timeouts = 1; reenable_sigpipe(); return (status = CMS_TIMED_OUT); } else { recvd_bytes = 0; reconnect_needed = 1; fatal_error_occurred = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } recvd_bytes = 0; returned_serial_number = (CMS_STATUS) ntohl(*((u_long *) temp_buffer)); rcs_print_debug(PRINT_ALL_SOCKET_REQUESTS, "TCPMEM recieved_reply: fd = %d, serial_number=%d, buffer_number=%d\n", socket_fd, returned_serial_number, buffer_number); if (returned_serial_number != serial_number) { rcs_print_error ("TCPMEM: Returned serial number(%d) does not match expected serial number(%d).\n", returned_serial_number, serial_number); reconnect_needed = 1; if (subscription_type == CMS_NO_SUBSCRIPTION) { reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } status = (CMS_STATUS) ntohl(*((u_long *) temp_buffer + 1)); header.was_read = ntohl(*((u_long *) temp_buffer + 2)); } else { header.was_read = 0; status = CMS_WRITE_OK; returned_serial_number = serial_number; } reenable_sigpipe(); return (status);}CMS_STATUS TCPMEM::write_if_read(void *user_data){ if (!write_permission_flag) { rcs_print_error("CMS: %s was not configured to write to %s\n", ProcessName, BufferName); return (status = CMS_PERMISSIONS_ERROR); } if (reconnect_needed && autoreconnect) { reconnect(); } if (!force_raw) { user_data = encoded_data; } if (reconnect_needed) { return (status = CMS_MISC_ERROR); } if (fatal_error_occurred) { if (status >= 0) { status = CMS_MISC_ERROR; } return (status); } disable_sigpipe(); if (socket_fd <= 0) { rcs_print_error("TCPMEM::write: Invalid socket descriptor. (%d)\n", socket_fd); reenable_sigpipe(); return (status = CMS_MISC_ERROR); } if (((int) handle_old_replies()) < 0) { reenable_sigpipe(); return status; } set_socket_fds(write_socket_fd); *((u_long *) temp_buffer) = htonl((u_long) serial_number); *((u_long *) temp_buffer + 1) = htonl((u_long) REMOTE_CMS_WRITE_REQUEST_TYPE); *((u_long *) temp_buffer + 2) = htonl((u_long) buffer_number); *((u_long *) temp_buffer + 3) = htonl((u_long) CMS_WRITE_IF_READ_ACCESS); *((u_long *) temp_buffer + 4) = htonl((u_long) header.in_buffer_size); int send_header_size = 20; if (total_subdivisions > 1) { *((u_long *) temp_buffer + 5) = htonl((u_long) current_subdivision); send_header_size = 24; } if (header.in_buffer_size < 0x2000 - 20 && header.in_buffer_size > 0) { memcpy(temp_buffer + 20, user_data, header.in_buffer_size); if (sendn (socket_fd, temp_buffer, header.in_buffer_size + send_header_size, 0, timeout) < 0) { reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } else { if (sendn(socket_fd, temp_buffer, send_header_size, 0, timeout) < 0) { reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } if (header.in_buffer_size > 0) { if (sendn(socket_fd, user_data, header.in_buffer_size, 0, timeout) < 0) { reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } } serial_number++; if ((min_compatible_version < 2.58 && min_compatible_version > 1e-6) || confirm_write) { if (recvn(socket_fd, temp_buffer, 12, 0, timeout, &recvd_bytes) < 0) { if (recvn_timedout) { timedout_request = REMOTE_CMS_WRITE_REQUEST_TYPE; consecutive_timeouts = 1; reenable_sigpipe(); return (status = CMS_TIMED_OUT); } else { recvd_bytes = 0; fatal_error_occurred = 1; reconnect_needed = 1; reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } recvd_bytes = 0; returned_serial_number = (CMS_STATUS) ntohl(*((u_long *) temp_buffer)); rcs_print_debug(PRINT_ALL_SOCKET_REQUESTS, "TCPMEM recieved_reply: fd = %d, serial_number=%d, buffer_number=%d\n", socket_fd, returned_serial_number, buffer_number); if (returned_serial_number != serial_number) { rcs_print_error ("TCPMEM: Returned serial number(%d) does not match expected serial number(%d).\n", returned_serial_number, serial_number); reconnect_needed = 1; if (subscription_type == CMS_NO_SUBSCRIPTION) { reenable_sigpipe(); return (status = CMS_MISC_ERROR); } } status = (CMS_STATUS) ntohl(*((u_long *) temp_buffer + 1)); header.was_read = ntohl(*((u_long *) temp_buffer + 2)); } else { header.was_read = 0; status = CMS_WRITE_OK; returned_serial_number = 0; } reenable_sigpipe(); return (status);}int TCPMEM::check_if_read(){ if (reconnect_needed && autoreconnect) { reconnect(); } if (reconnect_needed) { return (status = CMS_MISC_ERROR); } if (fatal_error_occurred) { if (status >= 0) { status = CMS_MISC_ERROR; } return (status); } disable_sigpipe(); if (socket_fd <= 0) { rcs_print_error ("TCPMEM::check_if_read: Invalid socket descriptor. (%d)\n", socket_fd); reenable_sigpipe(); return (status = CMS_MISC_ERROR); } if (((int) handle_old_replies()) < 0) { reenable_sigpipe(); return 0; } set_socket_fds(write_socket_fd); *((u_long *) temp_buffer) = htonl((u_long) serial_number); *((u_long *) temp_buffer + 1) = htonl((u_long) REMOTE_CMS_CHECK_IF_READ_REQUEST_TYPE); *((u_long *) temp_buffer + 2) = htonl((u_long) buffer_number); int send_header_size = 20; if (total_subdivisions > 1) { *((u_long *) temp_buffer + 3) = htonl((u_long) current_subdivision); } if (sendn(socket_fd, temp_buffer, send_header_size, 0, timeout) < 0) { status = CMS_MISC_ERROR; reconnect_needed = 1; reenable_sigpipe(); return (0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -