Помогите с синхронизацией 3х потоков и1го сокета

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 21 июл 2010.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Пытаюсь передавать звук поток через сеть своим "протоколом".В начале несколько секунд все работает но потом виснет.Походу коллизия между send и recv(хотя я и могу ошибатся насчет причины).Пытался сделать на мутексах но ничего невышло :dntknw:
    Вот клиент
    Код (Text):
    1. HINSTANCE hInst;                                // текущий экземпляр
    2. TCHAR szTitle[MAX_LOADSTRING];                  // Текст строки заголовка
    3. TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
    4. ATOM                MyRegisterClass(HINSTANCE hInstance);
    5. BOOL                InitInstance(HINSTANCE, int);
    6. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    7. INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    8.  
    9. int APIENTRY _tWinMain(HINSTANCE hInstance,
    10.                      HINSTANCE hPrevInstance,
    11.                      LPTSTR    lpCmdLine,
    12.                      int       nCmdShow)
    13. {
    14.     UNREFERENCED_PARAMETER(hPrevInstance);
    15.     UNREFERENCED_PARAMETER(lpCmdLine);
    16.     MSG msg;
    17.     HACCEL hAccelTable;
    18.     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    19.     LoadString(hInstance, IDC_AUDIOCLIENT, szWindowClass, MAX_LOADSTRING);
    20.     MyRegisterClass(hInstance);
    21.     if (!InitInstance (hInstance, nCmdShow))
    22.     {
    23.         return FALSE;
    24.     }
    25.  
    26.     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_AUDIOCLIENT));
    27.     while (GetMessage(&msg, NULL, 0, 0))
    28.     {
    29.         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    30.         {
    31.             TranslateMessage(&msg);
    32.             DispatchMessage(&msg);
    33.         }
    34.     }
    35.  
    36.     return (int) msg.wParam;
    37. }
    38. ATOM MyRegisterClass(HINSTANCE hInstance)
    39. {
    40.     WNDCLASSEX wcex;
    41.  
    42.     wcex.cbSize = sizeof(WNDCLASSEX);
    43.  
    44.     wcex.style          = CS_HREDRAW | CS_VREDRAW;
    45.     wcex.lpfnWndProc    = WndProc;
    46.     wcex.cbClsExtra     = 0;
    47.     wcex.cbWndExtra     = 0;
    48.     wcex.hInstance      = hInstance;
    49.     wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_AUDIOCLIENT));
    50.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    51.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    52.     wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_AUDIOCLIENT);
    53.     wcex.lpszClassName  = szWindowClass;
    54.     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    55.  
    56.     return RegisterClassEx(&wcex);
    57. }
    58. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    59. {
    60.    HWND hWnd;
    61.  
    62.    hInst = hInstance;
    63.  
    64.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    65.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    66.  
    67.    if (!hWnd)
    68.    {
    69.       return FALSE;
    70.    }
    71.  
    72.    ShowWindow(hWnd, nCmdShow);
    73.    UpdateWindow(hWnd);
    74.    SetWindowPos(hWnd,HWND_TOP,100,100,300,150,SWP_SHOWWINDOW);
    75.    return TRUE;
    76. }
    77. WAVEFORMATEX wf;
    78. struct protostruct
    79. {
    80.     unsigned long comma;
    81.     unsigned long datasz;
    82. };
    83. SOCKET s;
    84. HWAVEIN in;
    85. char *sendbuf;
    86. char *recvbuf;
    87. int sbSZ=0,rbSZ=0;
    88. WAVEHDR whS;
    89. HWAVEOUT play;
    90. CRITICAL_SECTION cs;
    91. WAVEHDR wd;
    92. HANDLE thr;
    93. DWORD WINAPI StartDataExchange(LPVOID lParam)
    94. {
    95.     HWND hWnd=(HWND)lParam;
    96.     wf.cbSize=0;
    97.     wf.wFormatTag=WAVE_FORMAT_PCM;
    98.     wf.wBitsPerSample=16;
    99.     wf.nSamplesPerSec=16000L;
    100.     wf.nChannels=1;
    101.     wf.nBlockAlign=2;
    102.     wf.nAvgBytesPerSec=wf.nSamplesPerSec*wf.nBlockAlign;
    103.     protostruct pt;
    104.     ZeroMemory(&pt,sizeof(protostruct));
    105.     pt.comma=0;
    106.     pt.datasz=0;
    107.     send(s,(char*)&pt,sizeof(protostruct),0);
    108.     send(s,(char*)&wf,sizeof(WAVEFORMATEX),0);
    109.     sbSZ=(wf.nBlockAlign*wf.nSamplesPerSec)/8;
    110.     rbSZ=sbSZ;
    111.     recvbuf=new char[rbSZ];
    112.     sendbuf=new char[sbSZ];
    113.     waveInOpen(&in,WAVE_MAPPER,&wf,(DWORD)hWnd,0L, CALLBACK_WINDOW);
    114.     whS.lpData=sendbuf;
    115.     whS.dwBufferLength=sbSZ;
    116.     waveInPrepareHeader(in,&whS,sizeof(WAVEHDR));
    117.     waveInAddBuffer(in,&whS,sizeof(WAVEHDR));
    118.     ZeroMemory(&pt,sizeof(protostruct));
    119.     HANDLE mut=CreateMutex(NULL,FALSE,"synhro");
    120.     WaitForSingleObject(mut,INFINITE);
    121.     waveInStart(in);
    122.     recv(s,(char*)&pt,sizeof(protostruct),0);
    123.     //MessageBox(0,"c","",MB_OK);
    124.     if(pt.comma=1)
    125.     {
    126.         int recvsz=0, acum=0;
    127.         for(;;)
    128.         {
    129.             recvsz=recv(s,recvbuf,pt.datasz,0);
    130.             recvbuf+=recvsz;
    131.             acum=acum+recvsz;
    132.             if(acum==pt.datasz)
    133.             {
    134.                 recvbuf-=pt.datasz;
    135.                 break;
    136.             }
    137.         }
    138.         ReleaseMutex(mut);
    139.         waveOutOpen(&play,WAVE_MAPPER,&wf,(DWORD)hWnd, 0L, CALLBACK_WINDOW);
    140.         wd.dwBufferLength=rbSZ;
    141.         wd.lpData=recvbuf;
    142.         waveOutPrepareHeader(play, &wd, sizeof(WAVEHDR));
    143.         waveOutWrite(play, &wd, sizeof(WAVEHDR));
    144.     }
    145.     return(0);
    146. }
    147.  
    148. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    149. {
    150.     int wmId, wmEvent;
    151.     PAINTSTRUCT ps;
    152.     HDC hdc;
    153.  
    154.     switch (message)
    155.     {
    156.     case WM_CREATE:
    157.         {
    158.             CreateWindow("button",TEXT("Start"),WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON ,20,50,70,30,hWnd,(HMENU)200,hInst,NULL);
    159.         }break;
    160.         case WM_NCCREATE:
    161.         {
    162.             LPCREATESTRUCT lpcp=(LPCREATESTRUCT)lParam;
    163.             lpcp->style &= (~WS_MAXIMIZEBOX );
    164.             lpcp->style &= (~WS_SIZEBOX );
    165.             SetWindowLong(hWnd, GWL_STYLE, lpcp->style);
    166.             return true;
    167.         }
    168.         break;
    169.     case WM_COMMAND:
    170.         wmId    = LOWORD(wParam);
    171.         wmEvent = HIWORD(wParam);
    172.         if(LOWORD(wParam)==200)
    173.         {
    174.             SOCKADDR_IN adr;
    175.             WSADATA wsd;
    176.             WSAStartup(MAKEWORD(2,0),&wsd);
    177.             adr.sin_family=AF_INET;
    178.             adr.sin_addr.s_addr=inet_addr("127.0.0.1");
    179.             adr.sin_port=htons(2020);
    180.             s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    181.             connect(s,(sockaddr*)&adr,sizeof(SOCKADDR_IN));
    182.             thr=CreateThread(0,0,&StartDataExchange,(void*)hWnd,0,0);
    183.         }
    184.     case WM_PAINT:
    185.         hdc = BeginPaint(hWnd, &ps);
    186.         // TODO: добавьте любой код отрисовки...
    187.         EndPaint(hWnd, &ps);
    188.         break;
    189.         case MM_WIM_DATA:
    190.             {
    191.                 //WaitForSingleObject(thr,INFINITE);
    192.                 waveInUnprepareHeader(in, &whS, sizeof(WAVEHDR));
    193.                 protostruct pt;
    194.                 ZeroMemory(&pt,sizeof(protostruct));
    195.                 pt.comma=1;
    196.                 pt.datasz=sbSZ;
    197.                 HANDLE mut=CreateMutex(NULL,FALSE,"synhro");
    198.                 WaitForSingleObject(mut,INFINITE);
    199.                 send(s,(char*)&pt,sizeof(protostruct),0);
    200.                 send(s,sendbuf,sbSZ,0);
    201.                 ReleaseMutex(mut);
    202.                 memset(sendbuf,NULL,sbSZ);
    203.                 whS.lpData=sendbuf;
    204.                 waveInPrepareHeader(in,&whS,sizeof(WAVEHDR));
    205.                 waveInAddBuffer(in,&whS,sizeof(WAVEHDR));
    206.                 waveInStart(in);
    207.             }break;
    208.             case MM_WOM_DONE:
    209.                 {
    210.                     WaitForSingleObject(thr,INFINITE);
    211.                     waveOutUnprepareHeader(play,&wd,sizeof(WAVEHDR));
    212.                     protostruct pt;
    213.                     ZeroMemory(&pt,sizeof(protostruct));
    214.                     HANDLE mut=CreateMutex(NULL,FALSE,"synhro");
    215.                     WaitForSingleObject(mut,INFINITE);
    216.                     recv(s,(char*)&pt,sizeof(protostruct),0);
    217.                     if(pt.comma=1)
    218.                     {
    219.                         int recvsz=0, acum=0;
    220.                         for(;;)
    221.                         {
    222.                             recvsz=recv(s,recvbuf,pt.datasz,0);
    223.                             recvbuf+=recvsz;
    224.                             acum=acum+recvsz;
    225.                             if(acum==pt.datasz)
    226.                             {
    227.                                 recvbuf-=pt.datasz;
    228.                                 break;
    229.                             }
    230.                         }
    231.                     }
    232.                     ReleaseMutex(mut);
    233.                     waveOutOpen(&play,WAVE_MAPPER,&wf,(DWORD)hWnd, 0L, CALLBACK_WINDOW);
    234.                     wd.dwBufferLength=rbSZ;
    235.                     wd.lpData=recvbuf;
    236.                     waveOutPrepareHeader(play, &wd, sizeof(WAVEHDR));
    237.                     waveOutWrite(play, &wd, sizeof(WAVEHDR));
    238.                 }break;
    239.     case WM_DESTROY:
    240.         PostQuitMessage(0);
    241.         break;
    242.     default:
    243.         return DefWindowProc(hWnd, message, wParam, lParam);
    244.     }
    245.     return 0;
    246. }
    Вот эхо сервер:
    Код (Text):
    1. HINSTANCE hInst;                                // текущий экземпляр
    2. TCHAR szTitle[MAX_LOADSTRING];                  // Текст строки заголовка
    3. TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
    4.  
    5. // Отправить объявления функций, включенных в этот модуль кода:
    6. ATOM                MyRegisterClass(HINSTANCE hInstance);
    7. BOOL                InitInstance(HINSTANCE, int);
    8. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    9. INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    10.  
    11. int APIENTRY _tWinMain(HINSTANCE hInstance,
    12.                      HINSTANCE hPrevInstance,
    13.                      LPTSTR    lpCmdLine,
    14.                      int       nCmdShow)
    15. {
    16.     UNREFERENCED_PARAMETER(hPrevInstance);
    17.     UNREFERENCED_PARAMETER(lpCmdLine);
    18.     MSG msg;
    19.     HACCEL hAccelTable;
    20.     LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    21.     LoadString(hInstance, IDC_AUDIOSERVER, szWindowClass, MAX_LOADSTRING);
    22.     MyRegisterClass(hInstance);
    23.  
    24.     if (!InitInstance (hInstance, nCmdShow))
    25.     {
    26.         return FALSE;
    27.     }
    28.  
    29.     hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_AUDIOSERVER));
    30.     while (GetMessage(&msg, NULL, 0, 0))
    31.     {
    32.         if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    33.         {
    34.             TranslateMessage(&msg);
    35.             DispatchMessage(&msg);
    36.         }
    37.     }
    38.  
    39.     return (int) msg.wParam;
    40. }
    41. ATOM MyRegisterClass(HINSTANCE hInstance)
    42. {
    43.     WNDCLASSEX wcex;
    44.  
    45.     wcex.cbSize = sizeof(WNDCLASSEX);
    46.  
    47.     wcex.style          = CS_HREDRAW | CS_VREDRAW;
    48.     wcex.lpfnWndProc    = WndProc;
    49.     wcex.cbClsExtra     = 0;
    50.     wcex.cbWndExtra     = 0;
    51.     wcex.hInstance      = hInstance;
    52.     wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_AUDIOSERVER));
    53.     wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    54.     wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    55.     wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_AUDIOSERVER);
    56.     wcex.lpszClassName  = szWindowClass;
    57.     wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    58.  
    59.     return RegisterClassEx(&wcex);
    60. }
    61. SOCKET s,client;
    62. struct protostruct
    63. {
    64.     unsigned long comma;
    65.     unsigned long datasz;
    66. };
    67. WAVEFORMATEX wf;
    68. DWORD WINAPI listT(LPVOID lParam)
    69. {
    70.     HWND hWnd=(HWND)lParam;
    71.     SOCKADDR_IN cadr;
    72.     listen(s,1);
    73.     int szcadr=sizeof(SOCKADDR_IN);
    74.     client=accept(s,(sockaddr*)&cadr,&szcadr);
    75.     protostruct pt;
    76.     ZeroMemory(&pt,sizeof(protostruct));
    77.     char *buf=new char[1024*512];
    78.     memset(buf,NULL,1024*512);
    79.     for(;;)
    80.     {
    81.         recv(client,(char*)&pt,sizeof(protostruct),0);
    82.         switch(pt.comma)
    83.         {
    84.         case 0:
    85.             {
    86.                 recv(client,(char*)&wf,sizeof(WAVEFORMATEX),0);
    87.                 wsprintf(buf,"%d",wf.nChannels,MB_OK);
    88.                 //MessageBox(0,buf,"",MB_OK);
    89.             }break;
    90.         case 1:
    91.             {
    92.                 //MessageBox(0,"s","",MB_OK);
    93.                 int recsz=0,acum=0;
    94.                 for(;;)
    95.                 {
    96.                     recsz=recv(client,buf,pt.datasz,0);
    97.                     acum=acum+recsz;
    98.                     buf+=recsz;
    99.                     if(acum==pt.datasz){buf-=pt.datasz;break;}
    100.                 }
    101.                 ZeroMemory(&pt,sizeof(protostruct));
    102.                 pt.comma=1;
    103.                 pt.datasz=acum;
    104.                 send(client,(char*)&pt,sizeof(protostruct),0);
    105.                 send(client,buf,acum,0);
    106.                
    107.             }break;
    108.         case 2:
    109.             {
    110.                 closesocket(s);
    111.                 closesocket(client);
    112.                 WSACleanup();
    113.                 PostMessage(hWnd,WM_QUIT,0,0);
    114.             }break;
    115.             ZeroMemory(&pt,sizeof(protostruct));
    116.         }
    117.     }
    118.     return(0);
    119. }
    120. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    121. {
    122.    HWND hWnd;
    123.  
    124.    hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
    125.  
    126.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    127.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    128.  
    129.    if (!hWnd)
    130.    {
    131.       return FALSE;
    132.    }
    133.  
    134.    ShowWindow(hWnd, SW_HIDE);
    135.    UpdateWindow(hWnd);
    136.    SOCKADDR_IN adr;
    137.    WSADATA wsd;
    138.    WSAStartup(MAKEWORD(2,0),&wsd);
    139.    adr.sin_addr.s_addr=0;
    140.    adr.sin_family=AF_INET;
    141.    adr.sin_port=htons(2020);
    142.    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    143.    bind(s,(sockaddr *)&adr,sizeof(SOCKADDR_IN));
    144.    CreateThread(0,0,&listT,(void*)hWnd,0,0);
    145.    return TRUE;
    146. }
    147. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    148. {
    149.     int wmId, wmEvent;
    150.     PAINTSTRUCT ps;
    151.     HDC hdc;
    152.  
    153.     switch (message)
    154.     {
    155.     case WM_COMMAND:
    156.         wmId    = LOWORD(wParam);
    157.         wmEvent = HIWORD(wParam);
    158.     case WM_PAINT:
    159.         hdc = BeginPaint(hWnd, &ps);
    160.         // TODO: добавьте любой код отрисовки...
    161.         EndPaint(hWnd, &ps);
    162.         break;
    163.     case WM_DESTROY:
    164.         PostQuitMessage(0);
    165.         break;
    166.     default:
    167.         return DefWindowProc(hWnd, message, wParam, lParam);
    168.     }
    169.     return 0;
    170. }
    Я догадываюсь что привязка к оконным сообщениям нужна для синхронизации с устройством.НО вот как все это хозяйство синхронизировать с сокетом?
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    _nic
    А зачем мутексы то? Тут же все должно быть до безобразия просто со звуком-то. Есть данные для отправки - отправляем, есть данные для чтения - читаем и воспроизводим. Какая тут синхронизация?
    Начни с простого.
    И потом, у тебя ни разу не уделено внимания обработке ошибок, ф-ции рецв и сенд могут возвращать и 0 и -1, у тебя же нет ни одной проверки на это.
    Как виснет? Где виснет? Просто рецв ждет чего-то или где-то зацикливается?
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Схема такая :
    пакет ушол->
    пакет пришол<-
    пакет ушол->
    пакет пришол<-
    Естественно что сокет(по схеме выше видно что все идет через один порт) надо синхронизовать,с микрофоном и воспроизведением,дабы небыло коллизий между recv и send.
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    _nic
    Учите мат часть. Пока RFC на TCP и UDP не перескажите дальше нет смысла общаться. А еще прочитайте про send и recv.
    До мьютексов вам еще рано. А еще походу и звук неправильно читаете поэтому все и виснет. Не говоря уже про процессы.
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Русский язык учи, противно смотреть:

    пакет ушёл->
    пакет пришёл<-
    пакет ушёл->
    пакет пришёл<-
     
  6. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Имеешь что то против нерусских на этом форуме?
    Извините но я не ваш студент.Не хотите писать по существу не пишите.
     
  7. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    > Имеешь что то против нерусских на этом форуме?
    Нерусский - это тот, кто смело ложит на правила языка, на котором он говорит?
     
  8. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    deLight
    кладёт.

    и вообще, для нерусских - раздел .ENGLISH,
    13/37! зип файль! .D
     
  9. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Граммар нацi пишiть будь ласка по темi , або йдiть лiсом.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Это и было по существу. Если вы не поняли перефразирую - все неправильно.
     
  11. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    когда все виснет и прога была запущена не из под отладчика можно взять process explorer посмотреть стеки потоков и приаттачить ольку обычно все становится ясно по крайней мере место где виснет найдеш а из за чего надо будет думать
     
  12. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    мне кажется или "нерусский" слова нет ?
    "не русский" еще ладно
     
  13. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Можно по подробней об этом способе?
     
  14. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    да там особо и рассказывать то не о чем открываеш
    process explorer смотриш бэктрейс записываеш
    в блокнот аттачиш ольку ну и по
    обстановке
    а вообще можно и студийный отладчик приаттачить там в меню
    debug->attach to process выбрать свою зависшую прогу
    и подллючится ну а дальше так же бэктрейс посмотреть
    тем более если ты к разрабатываемой проге приаттачиш
    студия красиво бэктрэйс покажет с именами твоих функций
    кстати книжку bugslayer'а Роббинс Дж. - Отладка приложений для Microsoft .NET и Microsoft Windows (2004)(14 Mb).djvu найдите скачайте и пользуйтесь ей как справочником там хорошо расписан отладчик студийный и как в нем максимально эффективно отлаживать
     
  15. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Судя по процесс эксплореру в обоих процессах одновременно send висит.Это что ли причина?Ведь send в отличии от recv неждет он просто данные отсылает.