Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 14

Acces всегда возвращает INVALID_SOCKET

17.04.2020, 11:03. Показов 2486. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начал изучать WinSock,все шло гладко до accept'a
Подскажите,пожалуйста,в чем проблема.
спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#pragma once
#pragma comment (lib,"Ws2_32.lib")
#define PORT_ADDR 80
#define NAME_SERVER_SOCKET "This is FTP server version 1.0"
#define QUEUE_SIZE 5
#include <iostream>
#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
//struct in_addr {
//  union {
//      struct {
//          unsigned char
//              s_b1,
//              s_b2,
//              s_b3,
//              s_b4;
//      } S_un_b;
//      struct {
//          unsigned short
//              s_w1,
//              s_w2;
//      } S_un_w;
//      unsigned long S_addr;
//  } S_un;
//};
//struct SOCKADDR_IN
//{
//  short sin_family;
//  unsigned short sin_port;
//  in_addr sin_adr;
//};
class server
{
private:
    const int WINSOCK_VERSION = 0x1010;
    WSADATA wsaData;
    SOCKET servsocket;
    const int WM_SERVER_ACCEPT = WM_USER + 1;
public:
    server();
    ~server();
    bool linkSocketPort();
    bool startWinSock();
    bool stopWinSock();
    bool waitSocket();
    bool getHostName();
    bool createSocket();
    void closeSocket();
    bool linkWindowSocket();
    void stopServer();
    bool startServer();
    bool listenSocket();
    bool waitForIncMsg();
    HWND getConsoleHWND();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include"FTP-serv.h"
server::server()
{
    SetConsoleTitle(NAME_SERVER_SOCKET);
}
server::~server()
{
}
bool server::startWinSock()
{
    if (WSAStartup(WINSOCK_VERSION, &wsaData))
    {
        printf("winsock is not initialized\n");
        WSACleanup();
        return false;
    }
    else printf("Whinsock initial ok!\n");
    return true;
}
bool server::stopWinSock()
{
    if (WSACleanup())
    {
        printf("Error crear!\n");
        return false;
    }
    else printf("OK!!!\n");
    return true;
}
bool server::waitSocket()
{
    Sleep(100);
    getHostName();
    Sleep(100);
    createSocket();
    Sleep(100);
    linkSocketPort();
    Sleep(100);
    linkWindowSocket();
    Sleep(100);
    closeSocket();
    return true;
}
bool server::getHostName()
{
    char chInfo[64];
    if (gethostname(chInfo, sizeof(chInfo)))
    {
        printf("Not local host!\n");
        return false;
    }
    else
    {
        printf("Local host name:");
        printf(chInfo);
        printf("\n");
    }
    return true;
}
bool server::createSocket()
{
    //this->getHostName();
    servsocket = socket(PF_INET, SOCK_STREAM, NULL);
    if (servsocket == INVALID_SOCKET)
    {
        printf("Error while creating socket!\n");
        return false;
    }
    return true;
    
}
bool server::linkSocketPort()
{
    SOCKADDR_IN socketaddr;
    socketaddr.sin_family = AF_INET;
    socketaddr.sin_addr.S_un.S_addr = INADDR_ANY;
    socketaddr.sin_port = htons(PORT_ADDR);
    if (bind(this->servsocket, (LPSOCKADDR)&socketaddr, sizeof(socketaddr)))
    {
        printf("Error bind socket\n");
        return false;
    }
    else printf("Sucsess bind!\n");
    return true;
 
}
void server::closeSocket()
{
    closesocket(servsocket);
}
 
bool server::linkWindowSocket()
{
    int errors;
    errors = WSAAsyncSelect(servsocket, getConsoleHWND(), WM_SERVER_ACCEPT, FD_ACCEPT);
    if (errors == SOCKET_ERROR)
    {
        printf("Bad async!\n");
        system("pause");
        return false;
    }
    else printf("Good async!\n");
    return true;
}
 
void server::stopServer()
{
    closeSocket();
    stopWinSock();
}
 
bool server::startServer()
{
    if (!startWinSock()) return false;
    Sleep(300);
    if (!getHostName()) return false;
    Sleep(300);
    if (!createSocket()) return false;
    Sleep(300);
    if (!linkSocketPort()) return false;
    Sleep(300);
    if (!linkWindowSocket())return false;
    Sleep(300);
    if (!listenSocket()) return false;
    if (!waitForIncMsg()) return false;
    return true;
}
 
bool server::listenSocket()
{
    int errors;
    errors = listen(servsocket, QUEUE_SIZE);
    if (errors == SOCKET_ERROR)
    {
        printf("Bad listen\n");
        return false;
    }
    else printf("Listen---OK!\n");
    return true;
}
 
bool server::waitForIncMsg()
{
    int clientSocket;
    SOCKADDR_IN client_addr;
    
    while (1)
    {
        int sock_len = sizeof(client_addr);
        clientSocket = accept(this->servsocket, (SOCKADDR*)&client_addr, &sock_len);
        if (clientSocket == INVALID_SOCKET)
        {
            printf("Accept failed!\n");
            //return false;
        }
        else printf("Access --- OK!\n");
    }
    return true;
}
 
HWND server::getConsoleHWND()
{
    
    HWND consoleWindow;
    consoleWindow = FindWindow(NULL, NAME_SERVER_SOCKET);
    if (consoleWindow == 0)
    {
        printf("No window!\n");
        system("pause");
        exit(1);
    }   
    return consoleWindow;
}
Добавлено через 3 минуты
Извиняюсь,accept
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.04.2020, 11:03
Ответы с готовыми решениями:

Функция socket всегда возвращает SOCKET_ERROR
функция socket вседа возвращает SOCKET_ERROR, создаю сокет следующим образом: void Socket::Create(int type /*= 1*/) { ...

Работа с winsock: accept возвращает INVALID_SOCKET
есть два проекта server и client, объединенные в один declare.h (один на оба проекта) #pragma once #include &lt;iostream&gt; ...

in_avail() всегда возвращает 0.
#include &lt;c++/4.4/iostream&gt; #include &lt;c++/4.4/streambuf&gt; int main() { int i,k; i=k=0; std::cout&lt;&lt;&quot;Enter two...

9
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.04.2020, 11:15
во-первых, отформатируйте код с помощью тегов [cpp]код между ними[/cpp].
во-вторых, предоставьте пример использования. а то, может, вы функцию, которая сокет сервера создаёт, не вызываете, а мы тут гадать будем, что и как вы вызываете.
в-третьих, проверьте, что после accept WSAGetLastError возвращает.
0
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 14
17.04.2020, 11:36  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include"FTP-serv.h"
server::server()
{
    SetConsoleTitle(NAME_SERVER_SOCKET);
}
server::~server()
{
}
bool server::startWinSock()
{
    if (WSAStartup(WINSOCK_VERSION, &wsaData))
    {
        printf("winsock is not initialized\n");
        WSACleanup();
        return false;
    }
    else printf("Whinsock initial ok!\n");
    return true;
}
bool server::stopWinSock()
{
    if (WSACleanup())
    {
        printf("Error crear!\n");
        return false;
    }
    else printf("OK!!!\n");
    return true;
}
bool server::waitSocket()
{
    Sleep(100);
    getHostName();
    Sleep(100);
    createSocket();
    Sleep(100);
    linkSocketPort();
    Sleep(100);
    linkWindowSocket();
    Sleep(100);
    closeSocket();
    return true;
}
bool server::getHostName()
{
    char chInfo[64];
    if (gethostname(chInfo, sizeof(chInfo)))
    {
        printf("Not local host!\n");
        return false;
    }
    else
    {
        printf("Local host name:");
        printf(chInfo);
        printf("\n");
    }
    return true;
}
bool server::createSocket()
{
    //this->getHostName();
    servsocket = socket(PF_INET, SOCK_STREAM, NULL);
    if (servsocket == INVALID_SOCKET)
    {
        printf("Error while creating socket!\n");
        return false;
    }
    return true;
    
}
bool server::linkSocketPort()
{
    SOCKADDR_IN socketaddr;
    socketaddr.sin_family = AF_INET;
    socketaddr.sin_addr.S_un.S_addr = INADDR_ANY;
    socketaddr.sin_port = htons(PORT_ADDR);
    if (bind(this->servsocket, (LPSOCKADDR)&socketaddr, sizeof(socketaddr)))
    {
        printf("Error bind socket\n");
        return false;
    }
    else printf("Sucsess bind!\n");
    return true;
 
}
void server::closeSocket()
{
    closesocket(servsocket);
}
 
bool server::linkWindowSocket()
{
    int errors;
    errors = WSAAsyncSelect(servsocket, getConsoleHWND(), WM_SERVER_ACCEPT, FD_ACCEPT);
    if (errors == SOCKET_ERROR)
    {
        printf("Bad async!\n");
        system("pause");
        return false;
    }
    else printf("Good async!\n");
    return true;
}
 
void server::stopServer()
{
    closeSocket();
    stopWinSock();
}
 
bool server::startServer()
{
    if (!startWinSock()) return false;
    Sleep(300);
    if (!getHostName()) return false;
    Sleep(300);
    if (!createSocket()) return false;
    Sleep(300);
    if (!linkSocketPort()) return false;
    Sleep(300);
    if (!linkWindowSocket())return false;
    Sleep(300);
    if (!listenSocket()) return false;
    if (!waitForIncMsg()) return false;
    return true;
}
 
bool server::listenSocket()
{
    int errors;
    errors = listen(servsocket, QUEUE_SIZE);
    if (errors == SOCKET_ERROR)
    {
        printf("Bad listen\n");
        return false;
    }
    else printf("Listen---OK!\n");
    return true;
}
 
bool server::waitForIncMsg()
{
    int clientSocket;
    SOCKADDR_IN client_addr;
    
    while (1)
    {
        int sock_len = sizeof(client_addr);
        clientSocket = accept(this->servsocket, (SOCKADDR*)&client_addr, &sock_len);
        if (clientSocket == INVALID_SOCKET)
        {
            printf("Accept failed!\n");
            //return false;
            printf("Error: %d",WSAGetLastError());
            return false;
        }
        else printf("Access --- OK!\n");
    }
    return true;
}
 
HWND server::getConsoleHWND()
{
    
    HWND consoleWindow;
    consoleWindow = FindWindow(NULL, NAME_SERVER_SOCKET);
    if (consoleWindow == 0)
    {
        printf("No window!\n");
        system("pause");
        exit(1);
    }   
    return consoleWindow;
}
Миниатюры
Acces всегда возвращает INVALID_SOCKET  
0
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 14
17.04.2020, 11:43  [ТС]
GbaLog-, залил

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#pragma once
#pragma comment (lib,"Ws2_32.lib")
#define PORT_ADDR 80
#define NAME_SERVER_SOCKET "This is FTP server version 1.0"
#define QUEUE_SIZE 5
#include <iostream>
#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
//struct in_addr {
//  union {
//      struct {
//          unsigned char
//              s_b1,
//              s_b2,
//              s_b3,
//              s_b4;
//      } S_un_b;
//      struct {
//          unsigned short
//              s_w1,
//              s_w2;
//      } S_un_w;
//      unsigned long S_addr;
//  } S_un;
//};
//struct SOCKADDR_IN
//{
//  short sin_family;
//  unsigned short sin_port;
//  in_addr sin_adr;
//};
class server
{
private:
    const int WINSOCK_VERSION = 0x1010;
    WSADATA wsaData;
    SOCKET servsocket;
    const int WM_SERVER_ACCEPT = WM_USER + 1;
public:
    server();
    ~server();
    bool linkSocketPort();
    bool startWinSock();
    bool stopWinSock();
    bool waitSocket();
    bool getHostName();
    bool createSocket();
    void closeSocket();
    bool linkWindowSocket();
    void stopServer();
    bool startServer();
    bool listenSocket();
    bool waitForIncMsg();
    HWND getConsoleHWND();
};
main();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "FTP-serv.h"
#include <Windows.h>
void main()
{
    server s;
    printf("Enter '+' to start server\n");
    if(getchar()=='+')
        s.startServer();
    rewind(stdin);
    printf("Enter '-' to stop server\n");
    if(getchar()=='-')
        s.stopServer();
    system("pause");
}
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.04.2020, 12:11
Лучший ответ Сообщение было отмечено antosa2972 как решение

Решение

код ошибки 10035 говорит о том, что ресурс, который вы пытаетесь получить, сейчас не доступен.
суть её здесь в том, что у вас функция WSAAsyncSelect делает сокет сервера неблокирующим.
после чего функция accept становится так же неблокирующей для этого сокета и возвращает ошибку WSAEWOULDBLOCK,
которая говорит о том, что клиент ещё не пришёл.
для того, чтобы этого избежать, можно вернуть сокет в блокирующее состояние,
либо же использовать, например, select для того, чтобы сразу несколько сокетов обрабатывать.
чтобы вернуть сокет в блокирующее состояние можно использовать WSAAsyncSelect с последним параметром равным 0.
это нужно для того, чтобы удалить ассоциацию сокета из окна.
а потом через ioctlsocket или WSAIoctl вернуть сокет в блокирующее состояние.
если вам не нужно удалять ассоциацию сокета, то тогда вам нужно использовать асинхронные техники обработки сокетов.
такие как select, WSAPoll и т.п.
1
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 14
17.04.2020, 18:55  [ТС]
А куда это вставить в код,если не секрет?

Добавлено через 17 минут
GbaLog-
Добавил ioctlsocket(servsocket, FIONBIO, 0);( перед циклом accept'a,ничего не изменилось
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.04.2020, 23:24
Цитата Сообщение от antosa2972 Посмотреть сообщение
А куда это вставить в код,если не секрет?
зависит от того, какой путь вы выберете и какая у вас цель.
0
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 14
18.04.2020, 01:22  [ТС]
GbaLog-
Хотелось бы,чтобы при подключении клиента,отрабатывало,на данный момент клиент просто ожидает.
0
0 / 0 / 0
Регистрация: 28.03.2020
Сообщений: 14
18.04.2020, 01:33  [ТС]
GbaLog-
На данный момент цель: законнектиться через fileZillu(все под ftp переделал)
Миниатюры
Acces всегда возвращает INVALID_SOCKET  
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
19.04.2020, 13:31
Цитата Сообщение от antosa2972 Посмотреть сообщение
Хотелось бы,чтобы при подключении клиента,отрабатывало,на данный момент клиент просто ожидает.
ну для этого вам нужно:
- либо переключить сокет в блокирующий режим(для этого вообще-то можно просто не вызывать WSAAsyncSelect, т.к. его использование становится бесполезным, если вы хотите всё назад вернуть),
- либо использовать асинхронные операции;
это можно загуглить.
один из самых простых для новичка методов - использовать select, но это имхо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.04.2020, 13:31
Помогаю со студенческими работами здесь

Почему функция всегда возвращает 0?
bool trie_tree::consonants_check(char letter) { return tolower(letter) == ('w' || 'r' || 't' || 'p' || 's' || 'd' || 'f' || 'g' || 'h'...

Функция всегда возвращает true
Привет. Помогите разобраться. Морской бой. Функция для ввода второй клетки. Сама функция: bool BattleShips::check_two (char...

GetPrivateProfileInt всегда возвращает ноль
Хотел считывать значение из INI-файла, но столкнулся с такой проблемой: #include &lt;Windows.h&gt; #include &lt;iostream&gt; ...

Бинарный поиск всегда возвращает (-1)
Всегда возвращает -1 #include &lt;iostream&gt; int binary(int* m, int n, int e) { int r = 0, l = n-1, h;

GetKeyboardLayout() всегда возвращает ангийскую раскладку
Доброго времени суток, товарищи! Есть служба, внутри которой постоянно должна проходить проверка текущей раскладки и, с учетом её,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru