Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 6
1

Асинхронные сокеты , ф-я WSAAsyncSelect и ее применение

06.02.2017, 23:17. Просмотров 3489. Ответов 8
Метки нет (Все метки)


Доброго времени суток , возникла проблема с асинхронностью сокетов , а именно функцией WSAAnynsSelect . Первым параметром у нее дескриптор сокета , второй параметр - дескриптор окна , его я получаю функцией 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
#include <Windows.h>
//#include <winsock2.h>
#include < iostream >
#pragma comment( lib, "ws2_32.lib" )
#pragma comment( lib, "USER32.lib" )
#include < conio.h >
using namespace std;
 
#define WSA_ACCEPT WM_USER + 1
 
#define MY_PORT    777 
#define NAME_SERVER_SOCKET "Server"
 
SOCKET mysocket;
 
HWND GetConsoleHWND()
{
    SetConsoleTitle(NAME_SERVER_SOCKET);
    HWND hwndConsoleWindow;
    hwndConsoleWindow=FindWindow(NULL, NAME_SERVER_SOCKET);
    if (hwndConsoleWindow==0)
    {
        printf("Error Find Window");
        exit(0);
    }
    return hwndConsoleWindow;
}
 
LRESULT  CALLBACK  MainWndProc(HWND  hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
// обработчик событий , но что у него за параметры ? где их взять ? и как вызвать этот обработчик ? 
// Нужно как то получить то сообщение от WSAAsynsSelect 
}
 
 
int main()
{
 char buff[1024];
 int strsize,Errors;
 
    printf("\t\t\t\tTCP SERVER\n");
 
    WSAStartup(0x0202,(WSADATA *) &buff[0]);
 
    mysocket=socket(AF_INET,SOCK_STREAM,0);
 
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_port=htons(MY_PORT);
    local_addr.sin_addr.s_addr=0;
 
 
    // bind для связывания
    bind(mysocket,(sockaddr *) &local_addr,sizeof(local_addr));
 
    // ожидание подключений
    listen(mysocket, 20);
 
    WSAAsyncSelect(mysocket,GetConsoleHWND(),WSA_ACCEPT,FD_ACCEPT);
 
        getchar();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2017, 23:17
Ответы с готовыми решениями:

Асинхронные сокеты Windows
Здравствуйте, форумчане! Интересует вопрос как можно синхронно отправить сообщение через...

C++ Асинхронные сокеты
Дайте ссылку на хороший гайд по асинхронным сокетам. Везде используются синхронные.

Асинхронные сокеты
Создаю асинхронный сокет. Выполняю вызов WSASend, указываю WSAOVERLAPPED структуру с событием. Но...

Асинхронные сокеты
Здравствуйте. Очень нужна ваша помощь. Вот callback функция которая передается в метод асинхронного...

8
Ушел с форума
Эксперт С++
16414 / 7389 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
07.02.2017, 09:00 2
См. третий параметр функции WSAAsyncSelect - ты сам задаешь оконное сообщение,
которое будет доставлено окну при наступлении соответствующего события.
И не следует забывать, что если есть оконная функция, должен быть и код,
который вычитывает из нее сообщения - GetMessage, TranslateMessage, DispatchMessage.
Иначе это работать не будет.

Кстати, с сокетами работать в асинхронной манере проще и эффективнее, если
использовать overlapped i/o или даже порты завершения (i/o completion ports).
MS сейчас сама не рекомендует WSAAsyncSelect.

Цитата Сообщение от Artem5784 Посмотреть сообщение
Весь интернет обрыл
Плохо рыл, значит.
Пример работы с этой функцией есть в исходниках Windows 7 SDK, например.
См. netds\winsock\accept.
1
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 6
07.02.2017, 21:43  [ТС] 3
Переделал код , используя предложенные вами функции . Все запускается , но выполнение останавливается на запуске getmessage() . Как будто ждет чего - то , но чего ? Клиент запускаю , и по логике он пытается установить соединение с сервером и отправить данные , WSAAsynsSelect() должна это зафиксировать и передать сообщение окну ; Такое ощущение как будто этого не происходит . Но если getmessage() вызвать передав вместо дескриптора NULL , все работает , но фиксирует отнюдь не те события , что надо . У меня задание : создать асинхронность , на основе WSAAsynsSelect() . Можно и любым методом и любыми ф-ми , лишь бы код был прост и краток . Вообще ход действий хотя бы правильный ? Может порядок вызовов не тот ? Или где какой параметр не тот передан ?

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
#include <Windows.h>
//#include <winsock2.h>
#include < iostream >
#pragma comment( lib, "ws2_32.lib" )
#pragma comment( lib, "USER32.lib" )
#include < conio.h >
using namespace std;
 
#define WSA_ACCEPT WM_USER + 1
 
#define MY_PORT    666 
#define NAME_SERVER_SOCKET "Server"
 
SOCKET mysocket;
SOCKET clientSocket;
MSG msg; 
HWND WINDOW; // дескриптор окна
 
HWND GetConsoleHWND()
{
    SetConsoleTitle(NAME_SERVER_SOCKET);
    return FindWindow(NULL, NAME_SERVER_SOCKET);
    }
 
LRESULT WINAPI WndProc(HWND hwnd, UINT msgn, LPARAM lParam, WPARAM wParam)
{
printf("\nmsgn = %d \n\n",msgn);
 
         if (msgn == WSA_ACCEPT) 
            {   
             switch(WSAGETSELECTEVENT(lParam))  
                    case FD_ACCEPT:
                              {    
                          printf("FD_ACCEPT");
                        //clientSocket = accept(mysocket, (sockaddr *)&client_addr, &client_addr_size);
                      }
            }
    return 0;
}
 
 
int main()
{
 WINDOW = GetConsoleHWND();
 setlocale( LC_ALL,"Russian" );
 char buff[1024];
 int strsize,Errors;
 
    printf("\t\t\t\tTCP SERVER\n");
 
    WSAStartup(0x0202,(WSADATA *) &buff[0]);
 
    mysocket=socket(AF_INET,SOCK_STREAM,0);
 
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_port=htons(MY_PORT);
    local_addr.sin_addr.s_addr=0;
 
    // bind для связывания
    bind(mysocket,(sockaddr *) &local_addr,sizeof(local_addr));
 
    // ожидание подключений
    listen(mysocket, 20);
 
    sockaddr_in client_addr;
 
    int client_addr_size = sizeof(client_addr);
 
    while(1)
    {
    printf("\nWINDOW = %d \n",WINDOW);
 
    WSAAsyncSelect(mysocket, WINDOW, WSA_ACCEPT, FD_ACCEPT);
 
    printf("Вызываем GetMessage \n\n"); // 
    
    printf("\nGetMessage = %d \n",GetMessage(&msg,WINDOW,NULL,NULL));
 
        // Вот здесь выполнение останавливается , не выдавая никаких ошибок и др.
                        
        TranslateMessage(&msg); // извлекаем сообщения окна и записываем в msg
        DispatchMessage(&msg); // перенаправляем сообщения в функция Wndproc ( сам обработчик )
 
    printf("%d",msg.message);
    printf("Вызываем обработчик событий \n\n");
 
    WndProc(WINDOW,msg.message,msg.wParam,msg.lParam);
 
    printf("Закончили и ждем нажатия клавиши \n\n");
    getchar();
    }
 
return 0;
}

Клиент
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
#include < iostream >
#pragma comment( lib, "ws2_32.lib" )
#include < Windows.h >
#include < conio.h >
#define PORT 666
#define SERVERADDR "127.0.0.1"
 
  int main()
  {
      char buff[1024]={"H"};
    printf("\t\t\t\tTCP CLIENT\n");
    WSADATA ws; // обьект структуры WSADATA
    // инициализация библиотеки Winsock
    WSAStartup(0x202,&ws);
    // создание сокета
    SOCKET my_sock;
    my_sock = socket(AF_INET,SOCK_STREAM,0);
 
    // установка соединения
 
    // заполнение структуры sockaddr_in
    sockaddr_in dest_addr;  // переменная для хранения адреса
    dest_addr.sin_family=AF_INET; // тип адреса
    dest_addr.sin_port=htons(PORT); //перевода номера порта из обычного в TCP представление
 
    // преобразование IP адреса из символьного в сетевой формат
      dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
 
    // пытаемся установить соединение 
    connect(my_sock,(sockaddr *)&dest_addr,sizeof(dest_addr));
    int nsize;
    while(1)
    {
      //recv(my_sock,buff, sizeof(buff),0);
      //printf("S >= C: %d",buff);
      //printf("S <= C: "); fgets(buff,sizeof(buff), stdin);
      //send(my_sock,buff,sizeof(buff),0);
 
      //recv(my_sock,buff, sizeof(buff),0);
      //printf("\nS >= C: %s",buff);
      printf("\nS <= C: "); fgets(&buff[0],sizeof(buff)-1, stdin);
      send(my_sock,&buff[0],sizeof(buff)-1,0);
    }
  }
0
Ушел с форума
Эксперт С++
16414 / 7389 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
07.02.2017, 22:58 4
А где проверка ошибок? Где гарантия, что все данные функции в коде
сервера и клиента выполняются успешно?
1
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 6
08.02.2017, 21:11  [ТС] 5
При запуске сервера и в последующем клиента , обработчик начинает фиксировать события и в поле message структуры MSG записывается число 49470 , фиксируется каждый раз , при переключении между окнами сервер/клиент . Iparam всегда 0 . Все функции выполняются успешно , т.е. возвращают 0 - 1 .

Добавлено через 6 минут
Хотя нет , функция TranslateMessage(&msg) , все - таки возвращает ноль , значит сообщение не передано , не помещено в очередь .

Добавлено через 21 час 43 минуты
Походу WSAAsynSelect() требует создания реального окна . Создал и получил дескриптор окна функцией CreateWindowEx и все заработало . Сообщение отправляются и обрабатываются . Но почему то событие FD_WRITE игнорируется . Срабатывает только на FD_ACCEPT и FD_READ . Причем FD_READ срабатывает даже без подключения клиента , когда запускаю клиент при попытке отправки FD_READ срабатывает аж два раза подряд . Функции ошибок не выдают . В чем может быть проблема ?

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
#include <Windows.h>
#include < iostream >
#pragma comment( lib, "ws2_32.lib" )
#pragma comment( lib, "USER32.lib" )
#include < conio.h >
using namespace std;
 
#define WSA_ACCEPT WM_USER + 1
 
#define MY_PORT    666 
#define NAME_SERVER_SOCKET "Server"
 
SOCKET mysocket;
SOCKET clientSocket;
MSG msg; 
HWND WINDOW; // дескриптор окна
 
char buff[1024];
 
sockaddr_in client_addr;
 
int client_addr_size = sizeof(client_addr);
 
 
LRESULT WINAPI WndProc(HWND hwnd, UINT msgn, WPARAM wParam, LPARAM lParam)
{
switch (msgn)
{
case WM_USER + 1:
switch (WSAGETSELECTEVENT(lParam))
case FD_ACCEPT:
    {
    printf(" FD_ACCEPT");
    clientSocket = accept(mysocket, (sockaddr *)&client_addr, &client_addr_size);
        return 0;
    }
case FD_READ:
    {
    printf("\n FD_READ ");
    recv(clientSocket,&buff[0],sizeof(buff),0);
    buff[0]++;
        return 0;
    }
case FD_WRITE:
    {
    printf("\n FD_WRITE ");
    send(clientSocket,&buff[0],sizeof(buff),0);
        return 0;
    }
}
}
 
 
int main()
{
 WNDCLASSEX wndc; // структура окна
 
 HWND _hwnd;
 
 setlocale( LC_ALL,"Russian" );
 int strsize,Errors;
 
    printf("\t\t\t\tTCP SERVER\n");
 
    wndc.lpszClassName="MyWnd";
    wndc.cbSize=sizeof(WNDCLASSEX);
    wndc.lpfnWndProc=WndProc; //Оконная процедура
    wndc.cbClsExtra=0;
    wndc.cbWndExtra=0;
    wndc.hbrBackground=HBRUSH(COLOR_WINDOW); //Цвет фона окна
    wndc.hInstance=GetModuleHandle(0); //Хендл приложения
    wndc.hCursor=LoadCursor(0,IDC_ARROW); //Загружаем старндартный курсор
    wndc.style=CS_HREDRAW|CS_VREDRAW;
    wndc.hIcon=0;
    wndc.hIconSm=0;
    wndc.lpszMenuName=0;
    RegisterClassEx(&wndc);
 
    HWND hWnd = CreateWindowEx(WS_EX_COMPOSITED,TEXT("MyWnd"),TEXT("MyWnd"),WS_OVERLAPPEDWINDOW,      CW_USEDEFAULT,0,CW_USEDEFAULT,0,0, 0,0,0);
 
 
    if((WSAStartup(0x0202,(WSADATA *) &buff[0])) != 0 )
        printf("Error WSAStartup \n");
 
    if((mysocket=socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
        printf("Error socket \n");
 
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_port=htons(MY_PORT);
    local_addr.sin_addr.s_addr=0;
 
    // bind для связывания
    if(bind(mysocket,(sockaddr *) &local_addr,sizeof(local_addr)) == SOCKET_ERROR)
        printf("Error bind %d\n",WSAGetLastError());
 
    // ожидание подключений
    if((listen(mysocket, 20)) == SOCKET_ERROR)
        printf("Error listen %d\n",WSAGetLastError());
 
    while(1)
    {
    if((WSAAsyncSelect(mysocket, hWnd, WSA_ACCEPT, FD_WRITE | FD_READ | FD_ACCEPT)) == SOCKET_ERROR )
        printf("Error WSAAsyncSelect \n");
 
    if(GetMessage(&msg,0,NULL,NULL) == -1)
        printf("Error GetMessage \n");
 
    WndProc(hWnd,msg.message,mysocket,msg.lParam);
 
    }
 
return 0;
}

Клиент

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
#include < iostream >
#pragma comment( lib, "ws2_32.lib" )
#include < Windows.h >
#include < conio.h >
#define PORT 666
#define SERVERADDR "127.0.0.1"
 
  int main()
  {
      char buff[1024]={"H"};
    //int buff;
    printf("\t\t\t\tTCP CLIENT\n");
    WSADATA ws; // обьект структуры WSADATA
    // инициализация библиотеки Winsock
    if((WSAStartup(0x202,&ws)) != 0)
        printf("Error WSAStartup \n");
    // создание сокета
    SOCKET my_sock;
    if((my_sock = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
        printf("Error socket \n");
 
    // установка соединения
 
    // заполнение структуры sockaddr_in
    sockaddr_in dest_addr;  // переменная для хранения адреса
    dest_addr.sin_family=AF_INET; // тип адреса
    dest_addr.sin_port=htons(PORT); //перевода номера порта из обычного в TCP представление
 
    // преобразование IP адреса из символьного в сетевой формат
      dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
 
    // пытаемся установить соединение 
    if((connect(my_sock,(sockaddr *)&dest_addr,sizeof(dest_addr))) == -1)
        printf("Error connect \n");
    int nsize;
 
    char bufff[20] = " Hellou  ";
 
    while(1)
    {
      if((send(my_sock,buff,sizeof(buff),0)) == -1)
          printf("Error send \n");
      if((recv(my_sock,buff, sizeof(buff),0)) == SOCKET_ERROR)
          printf("Error recv \n");
      printf("S >= C: %s",buff);
      printf("S <= C: "); fgets(buff,sizeof(buff), stdin);
    }
  }
0
Ушел с форума
Эксперт С++
16414 / 7389 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
09.02.2017, 09:01 6
WndProc не нужно самому вызывать.
Требуется лишь в цикле звать GetMessage, а затем выполнять "диспатчинг"
сообщений с помощью TranslateMessage и DispatchMessage.
1
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 6
09.02.2017, 11:46  [ТС] 7
Заменил участок кода на следующее . Никаких изменений нет , единственное что при использовании DispatchMessage() , функцию WndProc() действительно можно не вызывать вручную . А так событие FD_WRITE по - прежнему игнорирует , что довольно странно , ведь они все как бы из одной масти .

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while(1)
{
    if((WSAAsyncSelect(mysocket, hWnd, WSA_ACCEPT, FD_WRITE | FD_READ | FD_ACCEPT)) == SOCKET_ERROR )
        printf("Error WSAAsyncSelect \n");
 
while( (ret = GetMessage( &msg, hWnd, 0, 0)) != 0)
{ 
    if (ret == -1)
    {
       printf("Error GetMessage \n");
    }
    else
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
}
0
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 6
12.02.2017, 17:23  [ТС] 8
Убежденный, С этим разобрался уже , спасибо за ответы . Теперь стоит другая задача , использовать порты завершения (i/o completion ports) . Написал простой пример сервера . Запускается , но при приеме сообщения от клиента не записываются новые данные в массив buf . Отправляется символ 2 , который вручную указан при создании массива buf . В чем может быть проблема ?

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
#include < iostream >
#pragma comment( lib, "ws2_32.lib" )
#include < conio.h >
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <locale.h>
using namespace std;
 
#define SERVER_PORT 7710
 
char buff[2] = "2"; // буфер для обмена сообщений
 
enum
{
    SEND_DONE = 0,
    RECV_DONE = 1,
};
 
typedef struct _USER_DATA
{
    SOCKET sock;
} USER_DATA;
 
typedef struct _USER_IO
{
    WSAOVERLAPPED ov; 
    WSABUF buf;
    DWORD optype;
    DWORD flags;
    DWORD bytes;
} USER_IO;
 
 
void WorkingThread(HANDLE iocp)
{
    DWORD Bytes;
    USER_DATA * user;
    USER_IO *io;
 
while(1)
{
    GetQueuedCompletionStatus(iocp , &Bytes , (PULONG_PTR)&user,(LPOVERLAPPED *)&io, INFINITE);
 
    switch (io->optype)
    {
    case(SEND_DONE) :
        {
         WSASend(user->sock,&io->buf,1,&io->bytes, 0, (LPOVERLAPPED)io, 0);
         printf("\nОтправляем %s",&io->buf);
         io->optype * RECV_DONE;
         continue;
        }
    case(RECV_DONE) :
        {
         WSARecv(user->sock,&io->buf,1,&io->bytes, 0, (LPOVERLAPPED)io, 0);
         printf("\nПриляли %s",&io->buf);
         io->optype * SEND_DONE;
         continue;
        }
    }
    Sleep(100);
}
}
 
int main()
{
    WSADATA wsadata;
    SOCKADDR_IN listenaddr;
    SOCKET listensocket;
    HANDLE iocp;
    int i;
    setlocale(LC_ALL, "Russian");
    WSAStartup(0x0202, &wsadata);
    printf("TCP Сервер\n");
 
    listensocket = WSASocket(AF_INET , SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
 
    listenaddr.sin_family = AF_INET;
    listenaddr.sin_port = htons(SERVER_PORT);
    listenaddr.sin_addr.S_un.S_addr = INADDR_ANY;
 
    bind(listensocket, (SOCKADDR *)&listenaddr, sizeof(listenaddr));
    listen(listensocket,5);
 
    iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
 
    for(i = 1; i<=2;++i)
    {
    HANDLE thr = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&WorkingThread, (LPVOID)iocp, 0, 0);
    CloseHandle(thr);
    }
 
    while(1)
    {
    SOCKET clientsocket;
    SOCKADDR clientaddr;
    USER_DATA * user;
    USER_IO *io;
    int clientsize = sizeof(clientaddr);
 
    user = (USER_DATA *)malloc(sizeof(USER_DATA));
    io = (USER_IO *)malloc(sizeof(USER_IO));
    memset(user, 0, sizeof(USER_DATA));
    memset(io, 0, sizeof(USER_IO));
 
    clientsocket = WSAAccept(listensocket, (SOCKADDR *)&clientaddr, &clientsize, 0, 0);
    printf("Подключен новый клиент (%d).\n", clientsocket);
 
    user->sock = clientsocket;
    //io->buf.buf = (char *)malloc(1024);
    io->buf.buf = (char *)buff;
 
    io->buf.len = 2;
    io->optype = SEND_DONE;
 
    CreateIoCompletionPort((HANDLE)clientsocket, iocp, (ULONG_PTR)user, 0);
 
    WSASend(user->sock,&io->buf,1,&io->bytes, 0, (LPOVERLAPPED)io, 0);
}
}
0
0 / 0 / 0
Регистрация: 06.02.2017
Сообщений: 6
13.02.2017, 17:26  [ТС] 9
Все , уже разобрался во всем . Тему можно считать закрытой . Спасибо за ответы .
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2017, 17:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Клиент + Сервер, асинхронные сокеты
Привет! Пишу клиент серверное приложение на основе асинхронных сокетов. Цель передача картинки....

Асинхронные сокеты или потоки ?
Ребят qq, что лучше подойдёт: асинхронные сокеты или потоки ? Если, 1) игровой сервер ( менее 10...

Передача файлов, используя асинхронные сокеты
Как, используя класс SocketAsyncEventArgs передавать файлы от клиента серверу, или наоборот? До...

Клиент-сервер. Синхронные и асинхронные сокеты
Здравствуйте, в чем разница между синхронными и асинхронными сокетами? слышал что с асинхронным...


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

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

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