Есть функция которая устанавливает TCP соединение. Функция работает до тех пор пока не будет успешно установлено соединение, причем connect используется вместе с timeout. В целом функция работает хорошо, но если отключить сеть serivce network stop и запустить программу которая вызовет функцию make_connection, то make_connection войдёт в цикл установления соединениея. Если в процессе работы подключить сеть снова service network start, то make_connection установит соединение но, при попытке операции send или recv на сокете я получаю Broken pipe. Причем если просто выдераю пачкорд из розетки, то тогда make_connection даже после втыкания шнура обратно не может соединится какое-то время. А telnet же работает всегда и без гемора, подключаясь к тому же сервису, куда я пытаюсь подключиться из make_connection. Может кто подскажет где засада? int make_connection(char *host, unsigned int port) { int sock, res, lon, valopt, rv; struct sockaddr_in addr; struct timeval tv, tv2; long arg; fd_set write_set; struct hostent *hp; while (1) { // create socket sock = socket(AF_INET, SOCK_STREAM, 0); // set non-bloking mode arg = fcntl(sock, F_GETFL, NULL); arg |= O_NONBLOCK; fcntl(sock, F_SETFL, arg); addr.sin_family = AF_INET; addr.sin_port = htons(port); if ((hp = gethostbyname(host)) != NULL) { printf("resolve host %s succesfully\n", host); memcpy ((char *)&addr.sin_addr,hp->h_addr,hp->h_length); } else { addr.sin_addr.s_addr = inet_addr(host); printf("Can't resolve host, using inet_addr\n"); } printf("Trying to connect...\n"); res = connect(sock, (struct sockaddr *) &addr, sizeof(addr)); printf("res = %d\n", res); if (res < 0) { if (errno == EINPROGRESS) // was (errno = EINPROGRESS) { perror("connect"); printf("EINPROGRESS\n"); tv.tv_sec = 10; tv.tv_usec = 0; FD_ZERO(&write_set); FD_SET(sock, &write_set); if ((rv = select(sock + 1, NULL, &write_set, NULL, &tv)) > 0) { getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)&valopt, (socklen_t*)&lon); if (valopt) { printf("Error - valopt\n"); } else break; } else { printf("Timeout\n"); } } else { printf("Error in connect\n"); } } close(sock); sleep(5); } arg = fcntl(sock, F_GETFL, NULL); arg &= (~O_NONBLOCK); fcntl(sock, F_SETFL, arg); tv2.tv_sec = 50; tv.tv_usec = 0; lon = sizeof(int); setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &tv2, sizeof(tv2)); setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv2, sizeof(tv2)); return sock; }
Ответ на:
комментарий
от anonymous
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум connect return -1 errno = 105 (ENOBUFS) (2005)
- Форум Таймаут для connect() (2009)
- Форум покритикуйте следующий код(не мой) (2005)
- Форум C++ неблокирующие сокет (2018)
- Форум сокет. получить данные (2007)
- Форум FreeBSD: Неблокирующий kevent() (2011)
- Форум [C] Получить данные на TCP сокет (2008)
- Форум Запись в неблокируемый udp сокет (2020)
- Форум Сокеты передача сообщений между компьютерами. Помогите найти ошибку. (2012)
- Форум Клиент, сервер и их правильная работа. (2005)