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

Работа с winsock: accept возвращает INVALID_SOCKET

25.09.2015, 14:08. Показов 3926. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть два проекта server и client, объединенные в один

declare.h (один на оба проекта)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#include <iostream>
#include <string>
#include <conio.h>
#include <WinSock2.h>
 
#pragma comment (lib, "wsock32.lib")
#pragma comment (lib, "ws2_32.lib")
 
#define PORT_NUMBER 3030
 
using namespace std;
 
std::string crypt(const std::string &text, const std::string &password);

crypt.cpp (один на оба проекта)
Кликните здесь для просмотра всего текста
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
#include <string>
 
#define BUFF_SIZE 20
 
unsigned short gamma(const std::string &text)
{
    char buff[BUFF_SIZE] = { 0 };
    unsigned short g = 0, flag = 0;
 
    memset(buff, 0x55, BUFF_SIZE);
    memcpy(buff, text.c_str(), text.length());
 
    for (int i = 0; i < BUFF_SIZE; i++)
        g += (unsigned short)buff[i];
 
    for (int i = 0; i < 5; i++)
    {
        flag = g & 1;
        g >>= 1;
        if (flag)
            g |= 0x8000;
    }
 
    return g;
}
 
std::string crypt(const std::string &text, const std::string &password)
{
    std::string result = text;
    auto px = (unsigned short*)text.c_str();
    auto py = (unsigned short*)result.c_str();
    auto g = gamma(password);
 
    for (int i = 0; i < text.length() / 2; i++, px++, py++)
        *py = *px ^ g;
 
    return result;
}

server.cpp
Кликните здесь для просмотра всего текста
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
#pragma once
#include "..\declare.h"
#include <process.h>
 
void ConnectHandler(void *ptr);
 
string pass;
 
int main()
{
    WSADATA wsd = { 0 };
    sockaddr_in sa = { 0 };
    SOCKET sw = { 0 };
    int size = sizeof(sockaddr_in);
 
    cout << "Initializing WinSock..." << endl;
 
    if (WSAStartup(2, &wsd))
    {
        cout << "Error: WSAStartup!" << endl;
        _getch();
        return GetLastError();
    }
 
    cout << "Done!" << endl;
    cout << "Create Socket..." << endl;
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
 
    if (s == INVALID_SOCKET)
    {
        cout << "Error: socket!" << endl;
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Done!" << endl;
 
    sa.sin_family = AF_INET;
    sa.sin_port = htons(PORT_NUMBER);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
 
    cout << "Binding..." << endl;
 
    if (bind(s, (const sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
        cout << "Error: bind!" << endl;
        closesocket(s);
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Done!" << endl;
 
    cout << "Password: ";
    cin >> pass;
 
    cout << "Accepting..." << endl;
 
    while (true)
    {
        size = sizeof(sockaddr_in);
        sw = accept(s, (sockaddr*)&sa, &size);
 
        if (sw == INVALID_SOCKET)
        {
            cout << "Error: Accept!" << endl;
            closesocket(s);
            WSACleanup();
            _getch();
            return GetLastError();
        }
 
        size = sizeof(sockaddr_in);
        
        if (getpeername(sw, (sockaddr*)&sw, &size) != SOCKET_ERROR)
            cout << inet_ntoa(sa.sin_addr) << endl;
 
        if (_beginthread(ConnectHandler, 0, &sw) == -1)
        {
            cout << "Error: beginthread!" << endl;
            closesocket(s);
            WSACleanup();
            _getch();
            return GetLastError();
        }
    }
 
    closesocket(s);
    WSACleanup();
    cout << endl << "Press any key to continue...";
    _getch();
    return 0;
}
 
void ConnectHandler(void *ptr)
{
    SOCKET s = *(SOCKET*)ptr;
    char buff[MAX_PATH] = { 0 };
 
    int size = recv(s, buff, MAX_PATH, 0);
 
    if (size == SOCKET_ERROR)
    {
        cout << "Error: recv!" << endl;
        closesocket(s);
        return;
    }
 
    buff[size] = 0;
 
    std::string msg = crypt(buff, pass);
 
    cout << "Message: " << msg << endl;
 
    if (send(s, msg.c_str(), msg.length(), 0) == SOCKET_ERROR)
    {
        cout << "Error: send!" << endl;
        closesocket(s);
        return;
    }
 
    closesocket(s);
 
    cout << "Client was served!" << endl;
}

client.cpp
Кликните здесь для просмотра всего текста
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
#pragma once
#include "..\declare.h"
 
int main()
{
    WSADATA wsd = { 0 };
    sockaddr_in sa = { 0 };
    string ip, pass, msg;
    char buff[MAX_PATH] = { 0 };
 
    if (WSAStartup(2, &wsd))
    {
        cout << "Error: WSAStartup!" << endl;
        _getch();
        return GetLastError();
    }
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
 
    if (s == INVALID_SOCKET)
    {
        cout << "Error: socket!" << endl;
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Enter server IP-address (default 127.0.0.1):";
    cin >> ip;
 
    if (ip.empty())
        ip = "127.0.0.1";
 
    sa.sin_addr.s_addr = inet_addr(ip.c_str());
 
    if (sa.sin_addr.s_addr == INADDR_NONE)
    {
        cout << "Error: address!" << endl;
        closesocket(s);
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    sa.sin_family = AF_INET;
    sa.sin_port = htons(PORT_NUMBER);
 
    if (connect(s, (sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
        cout << "Error: connect failed!" << endl;
        closesocket(s);
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Connected!" << endl;
    cout << "Password: ";
    cin >> pass;
    cout << "Now begins the cycle of sending messages. To exit, just enter nothing." << endl;
 
    while (true)
    {
        cout << "Message: ";
        cin >> msg;
 
        if (msg.empty())
            break;
 
        msg = crypt(msg, pass);
 
        if (send(s, msg.c_str(), msg.length(), 0) == SOCKET_ERROR)
        {
            cout << "Error: send!" << endl;
            closesocket(s);
            WSACleanup();
            _getch();
            return GetLastError();
        }
 
        if (recv(s, buff, MAX_PATH, 0) == SOCKET_ERROR)
        {
            cout << "Error: receive!" << endl;
            closesocket(s);
            WSACleanup();
            _getch();
            return GetLastError();
        }
 
        std::cout << "You messeage '" << buff << "' was received!" << endl;
    }
 
    closesocket(s);
    WSACleanup();
    cout << endl << "Press any key to continue...";
    _getch();
    return 0;
}

в server.cpp на 65 строке accept возвращает INVALID_SOCKET почему то помогите исправить пожалуйста
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.09.2015, 14:08
Ответы с готовыми решениями:

Что возвращает функция accept()?
Пишу программу с реализацией сокетов. При изучении столкнулся с непониманием алгоритма. Если следовать википедии, то последовательность...

WinSock - recv возвращает не весь ответ?
Привет всем. Столкнулся с такой проблемой. Работаю с UDP сервером, посылаю ему запрос и на чтение recv или recvfrom, читает...

Работа Accept-Language
Парни приведите практический пример, как можно посмотреть как работает св-во Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3, а то...

11
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
25.09.2015, 15:47
Лучший ответ Сообщение было отмечено Penelent как решение

Решение

Цитата Сообщение от Penelent Посмотреть сообщение
в server.cpp на 65 строке accept возвращает INVALID_SOCKET почему то помогите исправить пожалуйста
А где listen? Вот здесь есть рабочий пример.
1
Заблокирован
25.09.2015, 22:56  [ТС]
dmitry94, точно, потерял, спасибо

Добавлено через 29 минут
еще вопрос теперь на 103 строке recv возвращает SOCKET_ERROR, в чем проблема?

Добавлено через 7 минут
з.ы. тоже в server.cpp

Добавлено через 4 часа 46 минут
актуально !!!
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
26.09.2015, 06:57
Цитата Сообщение от Penelent Посмотреть сообщение
еще вопрос теперь на 103 строке recv возвращает SOCKET_ERROR, в чем проблема?
В чем смысл потока? Что если делать без потока? Что возвращает WSAGetLastError?

Добавлено через 6 минут
Вы передаете в поток указатель на SOCKET, но к моменту recv он может измениться?
0
Заблокирован
26.09.2015, 11:20  [ТС]
Цитата Сообщение от dmitry94 Посмотреть сообщение
В чем смысл потока? Что если делать без потока?
дело было так: нам дали готовый код этой лабы, попросили немного переделать - встроить шифрование (тоже код дали), на самом деле там было все сильно в Си-стиле, я переделал под плюсовый, ну короче говоря я хочу сказать что этот поток там был изначально, я не знаю нафига его прикрутили, но убирать его не надо
Цитата Сообщение от dmitry94 Посмотреть сообщение
Что возвращает WSAGetLastError?
без понятия, я вообще с этой winsock первый раз дело имею
Цитата Сообщение от dmitry94 Посмотреть сообщение
Вы передаете в поток указатель на SOCKET, но к моменту recv он может измениться?
ну мне кажется что не должен, с чего бы? к тому же я проверил отладчиком, он точно не меняется

Добавлено через 3 часа 15 минут
вот еще раз, так сказать обновил, немного все по мелочи переделал, но ошибка по прежнему в том же месте

declare.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
#include <iostream>
#include <string>
#include <conio.h>
#include <WinSock2.h>
 
#pragma comment (lib, "wsock32.lib")
#pragma comment (lib, "ws2_32.lib")
 
#define PORT_NUMBER 3030
#define DEFAULT_PASSWORD "password"
 
using namespace std;
 
std::string crypt(const std::string &text, const std::string &password);

crypt.cpp
Кликните здесь для просмотра всего текста
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
#include <string>
 
#define BUFF_SIZE 20
 
unsigned short gamma(const std::string &text)
{
    char buff[BUFF_SIZE] = { 0 };
    unsigned short g = 0, flag = 0;
 
    memset(buff, 0x55, BUFF_SIZE);
    memcpy(buff, text.c_str(), text.length());
 
    for (int i = 0; i < BUFF_SIZE; i++)
        g += (unsigned short)buff[i];
 
    for (int i = 0; i < 5; i++)
    {
        flag = g & 1;
        g >>= 1;
        if (flag)
            g |= 0x8000;
    }
 
    return g;
}
 
std::string crypt(const std::string &text, const std::string &password)
{
    std::string result = text;
    auto px = (unsigned short*)text.c_str();
    auto py = (unsigned short*)result.c_str();
    auto g = gamma(password);
 
    for (int i = 0; i < text.length() / 2; i++, px++, py++)
        *py = *px ^ g;
 
    return result;
}

server.cpp
Кликните здесь для просмотра всего текста
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
#pragma once
#include "..\declare.h"
#include <process.h>
 
void ConnectHandler(void *ptr);
 
string pass;
 
int main()
{
    WSADATA wsd = { 0 };
    sockaddr_in sa = { 0 };
    SOCKET sw = { 0 };
    int size = sizeof(sockaddr_in);
 
    cout << "Initializing WinSock..." << endl;
 
    if (WSAStartup(2, &wsd))
    {
        cout << "Error: WSAStartup!" << endl;
        _getch();
        return GetLastError();
    }
 
    cout << "Done!" << endl;
    cout << "Create Socket..." << endl;
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
 
    if (s == INVALID_SOCKET)
    {
        cout << "Error: socket!" << endl;
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Done!" << endl;
 
    sa.sin_family = AF_INET;
    sa.sin_port = htons(PORT_NUMBER);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
 
    cout << "Binding..." << endl;
 
    if (bind(s, (const sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
        cout << "Error: bind!" << endl;
        closesocket(s);
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Done!" << endl;
 
    cout << "Listening..." << endl;
 
    if (listen(s, 5) == SOCKET_ERROR)
    {
        cout << "Error: Listen!" << endl;
        closesocket(s);
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Password " << "(default " << DEFAULT_PASSWORD << "): ";
    getline(cin, pass);
 
    if (pass.empty())
        pass = DEFAULT_PASSWORD;
 
    cout << "Accepting..." << endl;
 
    while (true)
    {
        size = sizeof(sockaddr_in);
        sw = accept(s, (sockaddr*)&sa, &size);
 
        if (sw == INVALID_SOCKET)
        {
            cout << "Error: Accept!" << endl;
            closesocket(s);
            WSACleanup();
            _getch();
            return GetLastError();
        }
 
        size = sizeof(sockaddr_in);
        
        if (getpeername(sw, (sockaddr*)&sw, &size) != SOCKET_ERROR)
            cout << inet_ntoa(sa.sin_addr) << endl;
 
        if (_beginthread(ConnectHandler, 0, (void*)sw) == -1)
        {
            cout << "Error: beginthread!" << endl;
            closesocket(s);
            WSACleanup();
            _getch();
            return GetLastError();
        }
    }
 
    closesocket(s);
    WSACleanup();
    cout << endl << "Press any key to continue...";
    _getch();
    return 0;
}
 
void ConnectHandler(void *ptr)
{
    SOCKET s = (SOCKET)ptr;
    char buff[MAX_PATH] = { 0 };
 
    int size = recv(s, buff, MAX_PATH, 0);
 
    if (size == SOCKET_ERROR)
    {
        cout << "Error: recv!" << endl;
        closesocket(s);
        return;
    }
 
    buff[size] = 0;
 
    string msg = crypt(buff, pass);
 
    cout << "Message: " << msg << endl;
 
    if (send(s, msg.c_str(), msg.length(), 0) == SOCKET_ERROR)
    {
        cout << "Error: send!" << endl;
        closesocket(s);
        return;
    }
 
    closesocket(s);
 
    cout << "Client was served!" << endl;
}

client.cpp
Кликните здесь для просмотра всего текста
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
#pragma once
#include "..\declare.h"
 
int main()
{
    WSADATA wsd = { 0 };
    sockaddr_in sa = { 0 };
    string ip, pass, msg;
    char buff[MAX_PATH] = { 0 };
 
    if (WSAStartup(2, &wsd))
    {
        cout << "Error: WSAStartup!" << endl;
        _getch();
        return GetLastError();
    }
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
 
    if (s == INVALID_SOCKET)
    {
        cout << "Error: socket!" << endl;
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Enter server IP-address (default 127.0.0.1): ";
    getline(cin, ip);
 
    if (ip.empty())
        ip = "127.0.0.1";
 
    sa.sin_addr.s_addr = inet_addr(ip.c_str());
 
    if (sa.sin_addr.s_addr == INADDR_NONE)
    {
        cout << "Error: address!" << endl;
        closesocket(s);
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    sa.sin_family = AF_INET;
    sa.sin_port = htons(PORT_NUMBER);
 
    if (connect(s, (sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
        cout << "Error: connect failed!" << endl;
        closesocket(s);
        WSACleanup();
        _getch();
        return GetLastError();
    }
 
    cout << "Connected!" << endl;
 
    cout << "Password " << "(default " << DEFAULT_PASSWORD << "): ";
    getline(cin, pass);
    
    if (pass.empty())
        pass = DEFAULT_PASSWORD;
 
    cout << "Now begins the cycle of sending messages. To exit, just enter nothing." << endl;
 
    while (true)
    {
        cout << "Message: ";
        getline(cin, msg);
 
        if (msg.empty())
            break;
 
        msg = crypt(msg, pass);
 
        if (send(s, msg.c_str(), msg.length(), 0) == SOCKET_ERROR)
        {
            cout << "Error: send!" << endl;
            closesocket(s);
            WSACleanup();
            _getch();
            return GetLastError();
        }
 
        if (recv(s, buff, MAX_PATH, 0) == SOCKET_ERROR)
        {
            cout << "Error: receive!" << endl;
            closesocket(s);
            WSACleanup();
            _getch();
            return GetLastError();
        }
 
        std::cout << "You messeage '" << buff << "' was received!" << endl;
    }
 
    closesocket(s);
    WSACleanup();
    cout << endl << "Press any key to continue...";
    _getch();
    return 0;
}
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
26.09.2015, 12:09
Цитата Сообщение от Penelent Посмотреть сообщение
с чего бы?
С того, что если с момента запуска потока до вызова recv() произойдет еще одно входящее соединение, то sw - это уже будет новое соединение, а не прошлое, которое изначально планировалось обработать в потоке...
Цитата Сообщение от Penelent Посмотреть сообщение
без понятия, я вообще с этой winsock первый раз дело имею
Так проверить нужно.
0
Заблокирован
26.09.2015, 12:20  [ТС]
Цитата Сообщение от dmitry94 Посмотреть сообщение
С того, что если с момента запуска потока до вызова recv() произойдет еще одно входящее соединение, то sw - это уже будет новое соединение, а не прошлое, которое изначально планировалось обработать в потоке...
чет не очень понятно честно говоря, откуда там еще одному входящему соединению быть... вы посмотрите код клиента то, к тому же я же вроде сказал я в отладчике проверял там тот же самый дескриптор передается, просто скопировал его до вызова _beginthread и поставил в функции потока точку останова, потом сравнил дескрипторы они равны были, еще какие то варианты есть?
Цитата Сообщение от dmitry94 Посмотреть сообщение
Так проверить нужно.
а что GetLastError не обнаруживает ошибки winsock-а? да ладно без разницы, это я уж так выпендрился просто, можно вообще поставить там return 1, так то это ни на что не влияет
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
26.09.2015, 12:33
Цитата Сообщение от Penelent Посмотреть сообщение
чет не очень понятно честно говоря, откуда там еще одному входящему соединению быть..
Если уверены, что не будет больше входящих соединений, зачем тогда использовать потоки, в чем глубокий смысл?

Если запускаете поток, то подразумеваете, что могут быть еще входящие соединения и указатель, который вы используете в потоке может указывать уже совершенно на другой сокет. Так делать нельзя, это черевато проблемами.

Чтобы понять в чем ошибка нужно:
1. Убрать использование потока, либо сделать его грамотно, проще пока убрать совсем если не ожидаете больше соединений.
2. Посмотреть какая ошибка возвращается WSAGetLastError
0
Заблокирован
26.09.2015, 12:46  [ТС]
dmitry94, я повторюсь я не знаю зачем сюда прилепили поток, но убирать его нельзя ! (он был в оригинальном коде) и потом ну не может же конкретно поток быть виноват в этом? может быть он тут немного лишний, но уж вреда то в нем точно нет... и чем это он не грамотно сделан?

а что касается WSAGetLastError то в том месте он возвращает 10038
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
26.09.2015, 12:55
Цитата Сообщение от Penelent Посмотреть сообщение
я повторюсь я не знаю зачем сюда прилепили поток, но убирать его нельзя ! (он был в оригинальном коде)
И что из этого, что он был?
Цитата Сообщение от Penelent Посмотреть сообщение
и чем это он не грамотно сделан?
Уже писал чем - используется указатель на сокет, который будет изменен при следующем вызове accept в цикле.
Цитата Сообщение от Penelent Посмотреть сообщение
а что касается WSAGetLastError то в том месте он возвращает 10038
WSAENOTSOCK
10038
Socket operation on nonsocket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.
Что еще раз подтверждает версию о том, что с указателем на сокет что-то не в порядке.
0
Заблокирован
26.09.2015, 13:04  [ТС]
алилуя !!! я нашел ошибку, и она вообще никак не связана с этим несчастным потоком, банальная невнимательность:
C++
1
getpeername(sw, (sockaddr*)&sw, &size)
передавать то надо было во втором параметре sa
C++
1
getpeername(sw, (sockaddr*)&sa, &size)
усе запахало, все равно спс за попытку помочь))
0
567 / 198 / 70
Регистрация: 25.05.2012
Сообщений: 816
26.09.2015, 13:11
Цитата Сообщение от Penelent Посмотреть сообщение
никак не связана с этим несчастным потоком
Но связано с сокетом sw. Данный пример показывает как легко можно изменить значение sw .
Суть от этого не меняется: ваш сервер потенциально проблемный. Я то писал это все для того, чтобы вы поняли в чем заключается эта потенциальная проблема, ну да ладно, со временем еще возможно наступите на подобные грабли..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2015, 13:11
Помогаю со студенческими работами здесь

Работа с сокетами. Не ждать accept
Начал изучать язык Си... а именно работу с сокетами. Нашёл простой пример TCP сервера: #include &lt;stdio.h&gt; #include...

Работа с winsock
Доброго времени суток. Запилил клиент-серверное приложение по примеру отсюда:...

Winsock, работа с полученным ответом
Передачу данных клиенту на сервере делает следующая строка: this-&gt;iSendResult = send( this-&gt;ClientSocket, ArpTable::getArpTable(),...

Работа с WinSock.dll напрямую
Подскажите, кто знает, ссылку - как работать с WinSock.dll напрямую, без всяких компонентов.

Работа с БД: возвращает ли запрос строки
Делаю стандартный запрос к БД: Set fil = New ADODB.Connection fil.ConnectionString = &quot;Provider=SQLOLEDB.1;Integrated...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru