Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
WinstonCherchil
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
#1

WSAGetLastError возвращает 87

22.02.2013, 14:39. Просмотров 1057. Ответов 6
Метки нет (Все метки)

Добрый день.

Такая ерунда: WSAGetLastError при вызове внутри функции myconnect() говорит что все хорошо. Но сразу при старте трида pushMessages() ругается на кривые руки параметры. Соответственно ничего после этого не работает WSARecv и recv возвращают -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
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
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <winsock2.h>
#include <stdlib.h>
#include "LineageMessages.h" //Этот класс пустой и ничего не делает. Имеет только конструктор и пару прототипов
 
#pragma comment(lib, "Ws2_32.lib")
 
#define MAX_CONN 9
//пока разрешим 9 подключений
 
SOCKET client_login_socket[MAX_CONN];
SOCKET client_game_socket[MAX_CONN];
//сокеты для логина и для, собственно, игры разделены потому что это 2 различных сервера.
bool busy_socket[MAX_CONN];
bool bStop[MAX_CONN];  //Тормоза для процессов pushMessages()
WSAEVENT updateEvents[MAX_CONN];  //массив событий для сокетов
HANDLE pushMessHandles[MAX_CONN];  //идентификаторы процессов pushMessages()
LineageMessages streams[MAX_CONN];  //Очередь сообщений TCP (сделана для удобного портирования на FreeBSD)
void RLE(void);                                   //Сообщает об ошибках WSA
 
unsigned long WINAPI pushMessages(void *);  // Процесс перекачивающий инфу из сокетов в объекты LineageMessages
 
int myconnect(const std::string &flags);     // Подключение и запуск трида pushMessages()
 
int main(/*int argc, char** argv*/) {
    using namespace std;
    for(int i = 0; i < MAX_CONN; i++){
        busy_socket[i] = false;
        bStop[i] = false;
    }
    WSAData wsa;
    if(WSAStartup(0x0101, &wsa)){ //инициализуем библиотеки...
        cout << "Some errors occurred while starting network!" << endl;
        exit(1);
    }
    //Читаем конфиг и базу
    fstream confFile;
    confFile.open("config.txt");
    //...
    //исправный код с меню, командами и прочим.
 
    int err = myconnect(flags);
 
    //...
    //исправный код с меню, командами и прочим.
    return 0;
}
 
int myconnect(const std::string &flags = (const std::string &)""){
    using namespace std;
    cout << "Runing connect(" << flags << ")\n";
    // Ищем не занятый сокет и записываем его номер в freeSock
    int freeSock = 0;
    while (freeSock < MAX_CONN){
        if(busy_socket[freeSock]){
            freeSock++;
        } else {
            break;
        }
    }
    if(freeSock == MAX_CONN){
        //Все сокеты заняты - Умираем.
        cout << "You have reached the connections limit!\n";
        return 1;
    }
    //Подготавливаем сокеты копипастой с гугла
    client_login_socket[freeSock] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(client_login_socket[freeSock] == INVALID_SOCKET)
    {
        cout << "Failed to create socket. Check your network;" << endl;
        /*TODO: INVALID_SOCKET handling*/
    } else {
        cout << "OK creating socket;" << endl;
    }
    sockaddr_in target;
    target.sin_addr.s_addr = inet_addr("192.168.137.7"); //Мой веб сервер =))
    target.sin_family = AF_INET;
    //target.sin_port = htons(2106);
    target.sin_port = htons(80);
    int target_sai_size = sizeof(target);
    cout << "Connecting to 192.168.137.7"  << endl;
    int err = connect(client_login_socket[freeSock],(SOCKADDR *) & target,target_sai_size);
    if(err != 0)
    {
      cout << "Failed to connect to 192.168.137.7"  << endl;
    } else
    {
        cout << "OK connect to 192.168.137.7"  << endl;
        updateEvents[0] = WSACreateEvent();
        if (updateEvents[0] == WSA_INVALID_EVENT) {
            cout << "WSACreateEvent failed with error = %d\n" << WSAGetLastError() << endl;
            closesocket(client_login_socket[freeSock]);
        }
        int r = WSAEventSelect( client_login_socket[freeSock], updateEvents[0], FD_READ | FD_CLOSE | FD_WRITE);
        cout << "R = " << r << endl;
        pushMessHandles[freeSock] = CreateThread(NULL,0,pushMessages,&freeSock,0,NULL);
        RLE(); // Пишет что ошибок нет - пони, радуга, бабочки.
    }
    return 0;
}
 
 
 
unsigned long WINAPI pushMessages(void * in){
    RLE();  // Говорит ошибка 87, иди учи плюсы.
    using namespace std;
    cout << "pushMessages() process started!" << endl;
    int arg = *(int *)in;
    int ret;
    bool bGoOn = true;
    unsigned long bytes;
    unsigned long zero = 0;
    char * buffer = new char[10240];
    while(bGoOn and !bStop[arg]){
        ret = WSAWaitForMultipleEvents(1, &updateEvents[arg], false, 1000, false);
        if (updateEvents[arg] == WSA_INVALID_EVENT) {cout << "Bad event" << endl;} //Debug
        cout << "ret = " << ret << endl; //debug
        if ((ret != WSA_WAIT_FAILED) && (ret != WSA_WAIT_TIMEOUT)){
            WSAResetEvent(updateEvents[ret - WSA_WAIT_EVENT_0]);
            bGoOn = false;
        } else {
            //TODO: обработать ошибки Download -> WSAWaitForMultipleObjects
             cout << "Gogo lame" << endl;
             bGoOn = false;
        }
    }
    bStop[arg] = false;
    delete [] buffer;
    closesocket(client_game_socket[arg]);
    busy_socket[arg] = false;
    bStop[arg] = false;
    return 0;
}
 
inline void RLE(void){
    std::cout << "error = " << WSAGetLastError() << std::endl;
    return;
}
Если нужно выложу полный код.

Добавлено через 14 минут
Самое скверное в том, что сам бы при помощи cout << отдебагал бы и нашел ошибку, но тут даже не знаю за чем следить...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 14:39
Ответы с готовыми решениями:

Почему если я задаю IP 127.0.0.1 то bind возвращает 0, а если задаю IP в сети, то bind возвращает -1
IP узнаю через 2IP.ru вот и если задаю полученный IP, то программа вылатает...

WSAGetLastError возвращает 5. Что это означает?
В гугле нашёл кое-что: &quot;WSAGetLastError переадресует вызов к GetLastError,...

Порт занят или ошибка WSAGetLastError 10048
Здраствуйте! Написал програмку чат по UDP протоколу... Все работает нормально,...

Создать функцию, которая возвращает массив в обратном порядке. Именно возвращает
Не могу никак создать функцию.

Метод без проблем возвращает строку, но не возвращает класс
Здравствуйте! Уже сутки бьюсь с проблемой и не пойму вообще почему она...

6
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.02.2013, 21:34 #2
Почему не используете версию 2.2 и макрос для передачи параметра в WSAStartup? См. тут.
1
WinstonCherchil
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
22.02.2013, 23:52  [ТС] #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему не используете версию 2.2 и макрос для передачи параметра в WSAStartup?
По причине большого объема кода и желания облегчить задачу людям, которые захотят мне помочь, я убрал часть кода в функции main а также нескольких других функций, которые отвечают за всяки менюшки, чтение конфига из файла. К сожалению, я случайно удалил и инициализацию ВСА. Видимо придется выложить полный код. Вот он:

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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
/*
 * File:   main.cpp
 * Author: Winston
 *
 * Created on 31 Деабрь 2012 г., 23:48
 */
 
 
 
 
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <winsock2.h>
#include <stdlib.h>
#include "LineageMessages.h"
 
#pragma comment(lib, "Ws2_32.lib")
 
#define MAX_CONN 9
//пока разрешим 9 подключений
/*
 *
 */
//Парсер принимает команду cmd целиком и отделяет от нее аргументы и return их
//принимаемое значение cmd возвращается уже без аргументов.
std::string parser(std::string &cmd);
 
 
int freeSock;
SOCKET client_login_socket[MAX_CONN];
SOCKET client_game_socket[MAX_CONN];
//сокеты для логина и для, собственно, игры разделены потому что это 2 различных сервера.
bool busy_socket[MAX_CONN];
bool bStop[MAX_CONN];
WSAEVENT updateEvents[MAX_CONN];
HANDLE pushMessHandles[MAX_CONN];
LineageMessages streams[MAX_CONN];
void RLE(void);
 
unsigned long WINAPI pushMessages(void *);
 
int myconnect(const std::string &flags);
int    help(const std::string &flags);
 
//Это одна из главных деталей программы:
//Здесь объявляется массив указателей на функции. При помощи него
//будут выполняться комманды введеные в консоль.
//прототипы функций, которые в нем используются написаны вверху.
//при удалении или добавлениие фунции следует менять NUM_COMMANDS
// и добавлять их имена в массив.
//NUM_COMMANDS - колличество функций в массиве
 
/*TODO: добавить парсер стринговых команд, для более адекватного и аккуратного вызова функций.
 а также для того что бы к командам можно было добавлять аргументы типа
 connect draconic.ru x3 Bhaalgorn*/
//TODO: добавить обработку ошибок в цикл с вызовом функций из массива.
#define NUM_COMMANDS 2
int (* comm_array[NUM_COMMANDS])(const std::string &) = {myconnect, help};
 
int main(/*int argc, char** argv*/) {
    freeSock = 0;
    using namespace std;
    for(int i = 0; i < MAX_CONN; i++){
        busy_socket[i] = false;
        bStop[i] = false;
    }
    WSAData wsa;
    if(WSAStartup(0x0101, &wsa)){ //инициализуем библиотеки...
        cout << "Some errors occurred while starting network!" << endl;
        exit(1);
    }
    //Читаем конфиг и базу
    fstream confFile;
    confFile.open("config.txt");
    string command = "";
    string quit = "quit";
    string commands[2] = {
        "connect",
        "help"
    };
    cout << "Good day! This is HiveMind control console. Enter commands to control bots" <<
            endl << "or type 'help' if you are mot familiar with this program" << endl;
    while (quit!= command and !cin.fail()) {
        getline(cin, command);
        string args = parser(command);
        if(quit == command){
            cout << "Are you sure? All connections will be lost!    (Y/N)" << endl;
            string confirm;
            cin >> confirm;
            if (!(confirm == "Y" or confirm == "Yes" or confirm == "y" or confirm == "yes")){
                command = "";
            }
        } else {
            for (int i = 0; i < NUM_COMMANDS; i++){
                if(commands[i] == command){
                    int err = (*comm_array[i])((const string &)args);
                    break;
                }
            }
        }
 
    }
    if(cin.fail()){cout << "Some error occurred. Sorry." << endl;}
    if(quit== command){cout << "Bye!" << endl;;}
 
    return 0;
}
 
 
 
///////////////////////////////////////////////////////////////////
 
 
int myconnect(const std::string &flags = (const std::string &)""){
    using namespace std;
    cout << "Runing myconnect(" << flags << ")\n";
    freeSock = 0;
    while (freeSock < MAX_CONN){
        if(busy_socket[freeSock]){
            freeSock++;
        } else {
            break;
        }
    }
    if(freeSock == MAX_CONN){
        cout << "You have reached the connections limit!\n";
        return 1;
    }
    client_login_socket[freeSock] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(client_login_socket[freeSock] == INVALID_SOCKET)
    {
        cout << "Failed to create socket. Check your network;" << endl;
        /*TODO: INVALID_SOCKET handling*/
    } else {
        cout << "OK creating socket;" << endl;
    }
    sockaddr_in target;
    target.sin_addr.s_addr = inet_addr("192.168.137.7");
    target.sin_family = AF_INET;
    //target.sin_port = htons(2106);
    target.sin_port = htons(80);
    int target_sai_size = sizeof(target);
    cout << "Connecting to 192.168.137.7"  << endl;
    int err = connect(client_login_socket[freeSock],(SOCKADDR *) & target,target_sai_size);
    if(err != 0)
    {
      cout << "Failed to connect to 192.168.137.7"  << endl;
    } else
    {
        cout << "OK connect to 192.168.137.7"  << endl;
        updateEvents[0] = WSACreateEvent();
        if (updateEvents[0] == WSA_INVALID_EVENT) {
            cout << "WSACreateEvent failed with error = %d\n" << WSAGetLastError() << endl;
            closesocket(client_login_socket[freeSock]);
        }
        int r = WSAEventSelect( client_login_socket[freeSock], updateEvents[0], FD_READ | FD_CLOSE | FD_WRITE);
        cout << "R = " << r << endl;
        pushMessHandles[freeSock] = CreateThread(NULL,0,pushMessages,&freeSock,0,NULL);
        RLE();
        cout << "Ololo thread created" << endl;
    }
    return 0;
}
 
 
 
unsigned long WINAPI pushMessages(void * in){
    RLE();
    std::cout << "Ololo inside thread" << std::endl;
    /*using namespace std;
    cout << "pushMessages() process started!" << endl;
    int arg = *(int *)in;
    int ret;
    bool bGoOn = true;
    unsigned long bytes;
    unsigned long zero = 0;
    char * buffer = new char[10240];
    while(bGoOn and !bStop[arg]){
        ret = WSAWaitForMultipleEvents(1, &updateEvents[arg], false, 1000, false);
        if (updateEvents[arg] == WSA_INVALID_EVENT) {cout << "boo-boo" << endl;}
        cout << "ret = " << ret << endl;
        if ((ret != WSA_WAIT_FAILED) && (ret != WSA_WAIT_TIMEOUT)){
            int iResult = recv(client_game_socket[arg], buffer, 10240,0);
            WSAResetEvent(updateEvents[ret - WSA_WAIT_EVENT_0]);
            bGoOn = false;
        } else {
            //TODO: обработать ошибки Download -> WSAWaitForMultipleObjects
             cout << "Gogo lame" << endl;
        }
    }
    bStop[arg] = false;
    delete [] buffer;
    closesocket(client_game_socket[arg]);
    busy_socket[arg] = false;
    bStop[arg] = false;*/
    return 0;
}
 
///////////////////////////////////////////////////////////////////
int help(const std::string &flags = (const std::string &)""){
    using namespace std;
    if("" == flags){
        cout << "help - displays this message." << endl;
        cout << "connect - connects to a default server." << endl;
        cout << "quit - exit program" << endl;
        cout << "Type help %command_name% to see additonal help about command." << endl;
        return 0;
    }
    if("help"== flags){
        cout << "Help - displays iformation and syntaxis of commands;\n" <<
                "For example \"help connect\" displays man page for connect command" << endl;
    }
    return 0;
}
 
std::string parser(std::string & cmd){
    using namespace std;
    string args = "";
    string command = "";
    int i;
    for (i = 0; i < cmd.length() and cmd[i] != ' '; i++){
        command = command + cmd[i];
    }
    i++;
    for(;i < cmd.length(); i++){
        args = args + cmd[i];
    }
    cmd = "";
    cmd = command;
    return args;
 
}
inline void RLE(void){
    std::cout << "error = " << WSAGetLastError() << std::endl;
    return;
}
Еще раз скажу, что ошибка, каким-то образом возникает именно в тот момент, когда начинается работа в триде.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.02.2013, 00:05 #4
Вы так и не ответили на мой вопрос.
0
WinstonCherchil
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
23.02.2013, 12:51  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Вы так и не ответили на мой вопрос.
WSAStartup использую.
Цитата Сообщение от WinstonCherchil Посмотреть сообщение
C++
1
2
3
4
5
WSAData wsa;
* * if(WSAStartup(0x0101, &wsa)){ //инициализуем библиотеки...
* * * * cout << "Some errors occurred while starting network!" << endl;
* * * * exit(1);
* * }
0x0101 использую потому что так предложил гугл, пока я разбирался с WSAEventSelect/WSAWaitForMultipleEvents.

Попробую испоьзовать 2.2 и доложу.

Добавлено через 8 минут
Нет. Использование WSAStartup(MAKEWORD(2, 2), &wsa) проблему не решило.
Я подозреваю что проблема кроется где-то в окончании ф-ии myconnect и что после выхода из нее удаляются все переменные, созданые без использования new, а ф-ия pushMessages использует указатели на них. Но только не могу понять какие.

Добавлено через 14 минут
Может я что-то не учел с точи зрения доступа к памяти различными потоками? Ну, ссылку на int freeSock он получает успешно, значит и к остальным данным должен иметь доступ.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.02.2013, 12:52 #6
Проверьте WSAGetLastError() внутри pushMessages().
1
WinstonCherchil
7 / 7 / 2
Регистрация: 20.01.2011
Сообщений: 73
23.02.2013, 15:52  [ТС] #7
Возвращает 87. В первой версии кода это 108-я строчка, а во второй 170-я.

C++
1
2
3
4
inline void RLE(void){ //return last error
    std::cout << "error = " << WSAGetLastError() << std::endl;
    return;
}
Добавлено через 2 минуты
Может кто-нибудь скинет пример использования WSAWaitForMultipleEvents в отдельном потоке? Просто сравнить мой алгоритм с работающим.

Добавлено через 21 минуту
Код для компиляции. Закоментил свой класс; он все равно ничего не делает пока что. Так же пару неточностей устранил...

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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
/*
 * File:   main.cpp
 * Author: Winston
 *
 * Created on 31 Деабрь 2012 г., 23:48
 */
 
 
 
 
#include <iostream>
#include <fstream>
#include <string>
#include <winsock2.h>
#include <windows.h>
#include <stdlib.h>
//#include "LineageMessages.h"
 
 
#define MAX_CONN 9
//пока разрешим 9 подключений
/*
 *
 */
//Парсер принимает команду cmd целиком и отделяет от нее аргументы и return их
//принимаемое значение cmd возвращается уже без аргументов.
std::string parser(std::string &cmd);
 
 
int freeSock;
SOCKET client_login_socket[MAX_CONN];
SOCKET client_game_socket[MAX_CONN];
//сокеты для логина и для, собственно, игры разделены потому что это 2 различных сервера.
bool busy_socket[MAX_CONN];
bool bStop[MAX_CONN];
WSAEVENT updateEvents[MAX_CONN];
HANDLE pushMessHandles[MAX_CONN];
//LineageMessages streams[MAX_CONN];
void RLE(void);
WSAData wsa;
 
unsigned long WINAPI pushMessages(void *);
 
int myconnect(const std::string &flags);
int    help(const std::string &flags);
 
//Это одна из главных деталей программы:
//Здесь объявляется массив указателей на функции. При помощи него
//будут выполняться комманды введеные в консоль.
//прототипы функций, которые в нем используются написаны вверху.
//при удалении или добавлениие фунции следует менять NUM_COMMANDS
// и добавлять их имена в массив.
//NUM_COMMANDS - колличество функций в массиве
 
/*TODO: добавить парсер стринговых команд, для более адекватного и аккуратного вызова функций.
 а также для того что бы к командам можно было добавлять аргументы типа
 connect draconic.ru x3 Bhaalgorn*/
//TODO: добавить обработку ошибок в цикл с вызовом функций из массива.
#define NUM_COMMANDS 2
int (* comm_array[NUM_COMMANDS])(const std::string &) = {myconnect, help};
 
int main(/*int argc, char** argv*/) {
    freeSock = 0;
    using namespace std;
    for(int i = 0; i < MAX_CONN; i++){
        busy_socket[i] = false;
        bStop[i] = false;
    }
    if(WSAStartup(MAKEWORD(2, 2), &wsa)){ //инициализуем библиотеки...
        cout << "Some errors occurred while starting network!" << endl;
        exit(1);
    }
    //Читаем конфиг и базу
    fstream confFile;
    confFile.open("config.txt");
    string command = "";
    string quit = "quit";
    string commands[2] = {
        "connect",
        "help"
    };
    cout << "Good day! This is HiveMind control console. Enter commands to control bots" <<
            endl << "or type 'help' if you are mot familiar with this program" << endl;
    while (quit!= command and !cin.fail()) {
        getline(cin, command);
        string args = parser(command);
        if(quit == command){
            cout << "Are you sure? All connections will be lost!    (Y/N)" << endl;
            string confirm;
            cin >> confirm;
            if (!(confirm == "Y" or confirm == "Yes" or confirm == "y" or confirm == "yes")){
                command = "";
            }
        } else {
            for (int i = 0; i < NUM_COMMANDS; i++){
                if(commands[i] == command){
                    int err = (*comm_array[i])((const string &)args);
                    //TODO: обработка ошибок через err
                    break;
                }
            }
        }
 
    }
    if(cin.fail()){cout << "Some error occurred. Sorry." << endl;}
    if(quit== command){cout << "Bye!" << endl;;}
 
    return 0;
}
 
 
 
///////////////////////////////////////////////////////////////////
 
 
int myconnect(const std::string &flags = (const std::string &)""){
    using namespace std;
    cout << "Runing myconnect(" << flags << ")\n";
    freeSock = 0;
    while (freeSock < MAX_CONN){
        if(busy_socket[freeSock]){
            freeSock++;
        } else {
            break;
        }
    }
    if(freeSock == MAX_CONN){
        cout << "You have reached the connections limit!\n";
        return 1;
    }
    client_login_socket[freeSock] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(client_login_socket[freeSock] == INVALID_SOCKET)
    {
        cout << "Failed to create socket. Check your network;" << endl;
        /*TODO: INVALID_SOCKET handling*/
    } else {
        cout << "OK creating socket;" << endl;
    }
    sockaddr_in target;
    target.sin_addr.s_addr = inet_addr("192.168.137.7");
    target.sin_family = AF_INET;
    //target.sin_port = htons(2106);
    target.sin_port = htons(80);
    int target_sai_size = sizeof(target);
    cout << "Connecting to 192.168.137.7"  << endl;
    int err = connect(client_login_socket[freeSock],(SOCKADDR *) & target,target_sai_size);
    if(err != 0)
    {
      cout << "Failed to connect to 192.168.137.7"  << endl;
    } else
    {
        cout << "OK connect to 192.168.137.7"  << endl;
        updateEvents[freeSock] = WSACreateEvent();
        if (updateEvents[freeSock] == WSA_INVALID_EVENT) {
            cout << "WSACreateEvent failed with error = %d\n" << WSAGetLastError() << endl;
            closesocket(client_login_socket[freeSock]);
        }
        int r = WSAEventSelect( client_login_socket[freeSock], updateEvents[freeSock], FD_READ | FD_CLOSE | FD_WRITE);
        cout << "R = " << r << endl;
         hostent *thisHost;
 
        thisHost = gethostbyname("");
        if (thisHost == NULL) {
            cout << "gethostbyname failed with error = " << WSAGetLastError() << endl;
        }
        pushMessHandles[freeSock] = CreateThread(NULL,0,pushMessages,&freeSock,0,NULL);
        RLE();
        cout << "Ololo thread created" << endl;
    }
    return 0;
}
 
 
 
unsigned long WINAPI pushMessages(void * in){
    RLE();
    std::cout << "Ololo inside thread" << std::endl;
    using namespace std;
    cout << "pushMessages() process started!" << endl;
    int arg = *(int *)in;
    unsigned int ret;
    bool bGoOn = true;
    unsigned long bytes;
    unsigned long zero = 0;
    char * buffer = new char[10240];
    while(bGoOn and !bStop[arg]){
        ret = WSAWaitForMultipleEvents(1, &updateEvents[arg], false, 1000, false);
        if (updateEvents[arg] == WSA_INVALID_EVENT) {cout << "boo-boo" << endl;}
        cout << "ret = " << ret << endl;
        if ((ret != WSA_WAIT_FAILED) && (ret != WSA_WAIT_TIMEOUT)){
            int iResult = recv(client_game_socket[arg], buffer, 10240,0);
            WSAResetEvent(updateEvents[ret - WSA_WAIT_EVENT_0]);
            bGoOn = false;
        } else {
            //TODO: обработать ошибки Download -> WSAWaitForMultipleObjects
             cout << "Gogo lame" << endl;
        }
    }
    bStop[arg] = false;
    delete [] buffer;
    closesocket(client_game_socket[arg]);
    busy_socket[arg] = false;
    bStop[arg] = false;
    return 0;
}
 
///////////////////////////////////////////////////////////////////
int help(const std::string &flags = (const std::string &)""){
    using namespace std;
    if("" == flags){
        cout << "help - displays this message." << endl;
        cout << "connect - connects to a default server." << endl;
        cout << "quit - exit program" << endl;
        cout << "Type help %command_name% to see additonal help about command." << endl;
        return 0;
    }
    if("help"== flags){
        cout << "Help - displays iformation and syntaxis of commands;\n" <<
                "For example \"help connect\" displays man page for connect command" << endl;
    }
    return 0;
}
 
std::string parser(std::string & cmd){
    using namespace std;
    string args = "";
    string command = "";
    unsigned int i;
    for (i = 0; i < cmd.length() and cmd[i] != ' '; i++){
        command = command + cmd[i];
    }
    i++;
    for(;i < cmd.length(); i++){
        args = args + cmd[i];
    }
    cmd = "";
    cmd = command;
    return args;
 
}
inline void RLE(void){
    std::cout << "error = " << WSAGetLastError() << std::endl;
    return;
}
Добавлено через 2 часа 7 минут
Вобщем я понял в чем проблема заключается. Трид по каким-то причинам "не видит" переменную WSAData wsa, и поэтому ничего не работает. Если перенести инициализацию и объявление в трид то многи проблемы исчезают. Буду переписывать. Если кто-то знает почему такая ерунда происходит, пожалуйста объясните. Было бы здорово устранить эту дыру в теории =))

Всем спасибо, кто пытался помочь.
0
23.02.2013, 15:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 15:52

OpenEventLog возвращает 0, GetLastError возвращает 1314 (Недостаточно прав)
Добрый день! В программе используется OpenEventLog, она возвращает нулевой...

Как вернуть в запросе значение по умолчанию, если SELECT возвращает NULL или ничего не возвращает?
Добрый день! Например я хочу чтобы донное выражение возвращало мне 0 или...

mysqli_insert_id не возвращает ID вставленной записи, постоянно возвращает "1".
Есть запрос такой расчитываю через insert_id получить id добавленной книги, но...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru