Я работаю над приложением C, которое использует функции POSIX TCP/IP для связи с сервером. В настоящее время я провожу некоторые тесты, чтобы увидеть, как приложение реагирует, когда соединение неожиданно закрывается.
Основная функция работного дома показана ниже:
uint32_t netWriteMsg(uint8_t * pmsg, size_t msg_size)
{
if(write(m_sockfd, pmsg, msg_size) < msg_size)
return ERR_NET_NOT_ALL_BYTES_SENT;
return ERR_NONE;
}
Эта функция работает должным образом, когда у меня хорошее соединение с сервером. Однако вызов этой функции после разрыва соединения приводит к сбою моего приложения.
В идеале я хотел бы, чтобы функция записи возвращала ошибку, указывающую, что запись не удалась. Это позволило бы мне обработать ошибку и перевести мою программу в соответствующее состояние. Однако этого не происходит.
Мне любопытно, почему этот вызов функции приведет к сбою приложения. Я несколько думаю, что это может быть проблема, когда вызов функции не блокируется, а затем указатель, на который он ссылается, становится «плохим», что приводит к ошибке сегментации.
Вот как я настроил свой сокет:
uint32_t netConnect()
{
/* locals */
struct sockaddr_in serv_addr;
fd_set fdset_sock; // only 1 file descriptor (socket fd) will be placed in this set
fd_set fdset_empty;
struct timeval time = {NET_TIMEOUT_CONNECT, 0};
int sock_error;
socklen_t optlen;
int error = ERR_NONE;
/* obtain socket file descriptor and set it to non-blocking */
m_sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT_NO);
inet_pton(AF_INET, IP_ADDR, &(serv_addr.sin_addr.s_addr));
/* attempt to connect */
error = connect(m_sockfd, &serv_addr, sizeof(serv_addr));
if(error) return ERR_NET_CONNECT_FAILED_IMMEDIATELY;
select(m_sockfd, &fdset_empty, &fdset_sock, &fdset_empty, &time); // blocks until socket is good or timeout occured
error = getsockopt(m_sockfd, SOL_SOCKET, SO_ERROR, &sock_error, &optlen);
if(error) return ERR_NET_COULD_NOT_GET_SOCKET_OPTION;
if(sock_error)
return ERR_NET_CONNECT_ATTEMPT_TIMEOUT;
m_is_connected = 1;
return ERR_NONE;
}
Любая помощь будет оценена