Перед этим стоит проблема привязки к гнезду. 1-й экземпляр работает правильно, то есть socket() возвращает успех и, следовательно, возвращает bind() и listen(), accept() и, следовательно, recv() - все отлично до сих пор. Ошибка второго экземпляра при привязке «Адрес уже используется»Ошибка сокета :: Адрес уже используется
Я прошел через все сообщения ранее, и я не вижу какого-либо конкретного решения, предоставленного на том же самом.
Мой код выглядит следующим образом: -
if((status = getaddrinfo(NULL,"8080",&hints,&servinfo))!=0){
ALOGE("Socket:: getaddrinfo failed %s\n",strerror(errno));
return NULL;
}
server_sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
if(server_sockfd == -1) {
ALOGE("Socket:: Scoket System Call failed %s\n",strerror(errno));
return NULL;
}
if ((setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int))) < 0)
{
ALOGE("Socket:: setsockopt failed %s\n",strerror(errno));
return NULL;
}
ret = bind(server_sockfd, servinfo->ai_addr,servinfo->ai_addrlen);
if(ret!=0) {
ALOGE("Socket:: Error Binding on socket %s\n",strerror(errno));
return NULL;
}
Этот код работает на андроид платформе.
Я закрыта каждую сессию перед открытием новой сессии, как показано ниже: -
ret = shutdown(client_sockfd,0);
if(ret != 0)
ALOGE("Socket:: Shutdown Called%s\n",strerror(errno));
Я попытался с близкими, как хорошо, но это не сработало.
Удивительно ошибка не исчезает даже тогда, когда мы пытаемся открыть сокет после долгого времени (в соответствии с TIME_WAIT логики)
Может кто-нибудь, пожалуйста, руководство меня к надлежащему вызову или API или логики (в коде, а не по команде линии, кроме непосредственного убийства процесса), чтобы справиться с этой ситуацией?
Вы (неправильно) закрываете подключенный клиентский сокет, но вы также закрываете сокет сервера прослушивания? Вы не можете привязать новый TCP-сокет к тому же IP-порту, к которому привязан предыдущий сокет. Почему вы пытаетесь связать несколько сокетов с одним и тем же IP-портом в первую очередь? –
Спасибо за ваши комментарии. Да, я звоню близко как в клиентском, так и в серверном сокетах. Логика, лежащая в основе этого, - это то, что мой серверный поток является частью приложения, которое запускается и основано на успешном запуске. Я создаю поток сервера. Этот поток необязательно должен быть активным даже после закрытия моего приложения. Чтобы обработать это условие, я попытался для закрытия сокета, когда вызывается мой pthread_exit. Что касается клиента, я предполагаю, что его ОК будет закрыто, когда клиент выполнит свою работу. Пожалуйста, исправьте меня неправильно, если моя логика кажется неправильной. – user5729621
Вы явно не закрываете все правильно. Что-то еще открыто. Просьба представить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), показывающий, как вы управляете всеми сокетами. –