2015-12-30 3 views
1

Перед этим стоит проблема привязки к гнезду. 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 или логики (в коде, а не по команде линии, кроме непосредственного убийства процесса), чтобы справиться с этой ситуацией?

+1

Вы (неправильно) закрываете подключенный клиентский сокет, но вы также закрываете сокет сервера прослушивания? Вы не можете привязать новый TCP-сокет к тому же IP-порту, к которому привязан предыдущий сокет. Почему вы пытаетесь связать несколько сокетов с одним и тем же IP-портом в первую очередь? –

+0

Спасибо за ваши комментарии. Да, я звоню близко как в клиентском, так и в серверном сокетах. Логика, лежащая в основе этого, - это то, что мой серверный поток является частью приложения, которое запускается и основано на успешном запуске. Я создаю поток сервера. Этот поток необязательно должен быть активным даже после закрытия моего приложения. Чтобы обработать это условие, я попытался для закрытия сокета, когда вызывается мой pthread_exit. Что касается клиента, я предполагаю, что его ОК будет закрыто, когда клиент выполнит свою работу. Пожалуйста, исправьте меня неправильно, если моя логика кажется неправильной. – user5729621

+0

Вы явно не закрываете все правильно. Что-то еще открыто. Просьба представить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), показывающий, как вы управляете всеми сокетами. –

ответ

1

A socket is one half a channel of communication between two computers over a network on a particular port. (the other half is the corresponding socket on the other computer)

Ошибка очень ясна. Предположим в этом случае. Как уже упоминалось, Address already in use, так что сокет, который вы пытаетесь подключить во второй попытке, уже используется (порт уже занят) -> возможно, из-за подключения первого сокета.

Для дальнейшего исследования проверить другой SO question here и here

+0

Thanks.Indeed ошибка понятна, как я упоминал. Но я хочу повторно использовать тот же порт, который я не могу даже после вызова close (а также shutdown()), прежде чем пытаться повторно открыть его. Все объекты close() doo snot возвратите любую ошибку в первый раз. Если закрытие завершится неудачей, тогда закрыть должен выдать ошибку, чтобы запрошенный fd не мог быть закрыт. Проверьте мой запрос. – user5729621

+0

@ user5729621 Можете ли вы опубликовать фрагмент кода, в котором вы закрываете ранее открытый сокет? –

+0

Я уже опубликовал то же самое.Я имею в виду, что я пытался с закрытием Api и закрыть Api, но следующие итерации bind дают ошибку. Также я пробовал с другим номером порта, но он выдавал ту же ошибку – user5729621

0

Вы не можете разделять слушающий порт TCP между двумя процессами, даже с SO_REUSEADDR.

NB shutdown() не закрывает сеанс TCP. Он его закрывает. Вы должны закрыть сокет.

+0

OP сказал: «* Я пытался с близким, но это не сработало. *« –

+0

@RemyLebeau Действительно. Трудно понять, почему он беспокоился с 'shutdown()' вообще, и почему он не использовал 'close()' в первую очередь. – EJP

Смежные вопросы