Я знакомлюсь с Unix-сокетами для межпроцессного взаимодействия и следую инструкции здесь . Каждый раз, когда я запускаю программу, выполняющую роль сервера (в руководстве называемую echos.c), я получаю сообщение об ошибке bind: Address already in use
, за исключением первого запуска после удаления всех файлов сборки.
Ошибка приходит из этого раздела кода:
#define SOCK_PATH "echo_socket"
int main(void)
{
int s, s2, len;
socklen_t t;
struct sockaddr_un local, remote;
char str[100];
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
local.sun_family = AF_UNIX;
strcpy(local.sun_path, SOCK_PATH);
unlink(local.sun_path);
len = strlen(local.sun_path) + sizeof(local.sun_family);
if (bind(s, (struct sockaddr *)&local, len) == -1) {
perror("bind");
exit(1);
}
// ...
При первоначальном запуске программа создает файл сокета с именем echo_socke
(я проверил это с помощью ls -l
, и этоСтранно, что в имени отсутствует буква 't', чтобы сделать его echo_socket
), и затем он успешно переходит к bind
и listen
для клиентского процесса.
Однако при последующих запусках, где яне удаляйте файлы сборки, я получаю сообщение об ошибке bind: Address already in use
из строк
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
При дополнительном тестировании я обнаружил, что unlink(local.sun_path)
возвращает ошибку No such file or directory
, поэтому я вычисляю сокетфайл, к которому bind
пытается получить доступ, не найден. Может ли это быть из-за того, что в имени файла отсутствует символ, как упоминалось ранее? (Но это работает в первый раз, так что не может быть?). Буду очень признателен за любую помощь в выяснении того, что происходит.