PDA

View Full Version : مشکل با serversocketو clientsocket



djscsi
سه شنبه 07 خرداد 1387, 09:03 صبح
http://delphi.about.com/od/networking/l/aa112602a.htm
من طبق این صفحه نوشتم ولی کار نمیکنه و سوکت ارور میده
اصلا client فعال نمیشه
به نظر شما مشکل از کجاست؟:متفکر:

amin_alexi
سه شنبه 07 خرداد 1387, 13:29 عصر
سلام دوست عزیز اول بگین چه Error میده !!!!
من تو یه پروژه از Socket ها استفاده کردم !
فکر کنم شما این برنامه رو اجرا نکردی ! (scktsrvr.exe)
این برنامه واسه مدیریت Socket هاست Code اون هم بگردی تو Delphi که نصب کردی هست !!
تو پنجره RUN می تونی اون رو اجرا کنی ... بنویس scktsrvr.exe ...
اگه مشکلت حل نشد Error رو به همراه برنامه بزار تا ببینم مشکلت چیه !؟

amin_alexi
سه شنبه 07 خرداد 1387, 13:35 عصر
راستی !!!
اگه FireWall داری یا آنتی ویروس باید چک کنی ببینی شاید Port ی که بهش وصل میشی رو بسته باشن !!
به هر حال اگه مشکلت حل نشد Error رو به همراه برنامه بزار تا ببینیم مشکلت چیه !؟

djscsi
سه شنبه 07 خرداد 1387, 18:43 عصر
ممنون دوست عزیز
1.ایا از port دیگه ای میتونم استفاده کنم
2.چه طور میتونم port های باز رو تشخیص بدم (من تو شبکه محلی هستم)

به هر حال اگه مشکلت حل نشد Error رو به همراه برنامه بزار تا ببینیم مشکلت چیه !؟
الان وقت تموم شده (من تو دانشگاهم) فردا میزارم
برنامم درست عین همون مثال هست فقط host هست 192.168.10.22
و ip client هست 192.168.10.20
بازم ممنون

djscsi
چهارشنبه 08 خرداد 1387, 16:00 عصر
اقا من مشکلم حل شد ولی یه مشکل دیگه ای هست
اونم اینه که من میخام وقتی برنامه رو اجرا میکنم تمام سیستمهایشبکه رو شناسایی کنه و تو یه مثلا listbox برام بنویسه چه طوری میشه

amin_alexi
چهارشنبه 08 خرداد 1387, 16:30 عصر
یه راهش Ping کردن به تمام Ip های تو رنج !!!
و گرفتن Response ... تو یه برنامه این مدلی Computer های تو یه رنج رو شناسایی کرده بود !!!
اما تو Delphi چطور میشه این کار رو کرد نمیدونم !
نباید سخت باشه !! پیدا کردی به ما هم بگو ...
روش Ping رو به کار ببر به نتیجه می رسی ...

djscsi
چهارشنبه 08 خرداد 1387, 16:39 عصر
ممنون امین جان
چشم اگه شما هم چیزی پیدا کردی بنویس

B_YAGHOBI
چهارشنبه 08 خرداد 1387, 17:00 عصر
براي بدست آوردن كامپيوتر هاي شبكه :


type
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..100] of TNetResource;

function CreateNetResourceList(ResourceType: DWord;
NetResource: PNetResource;
out Entries: DWord;
out List: PNetResourceArray): Boolean;
var
EnumHandle: THandle;
BufSize: DWord;
Res: DWord;
begin
Result := False;
List := Nil;
Entries := 0;
if WNetOpenEnum(RESOURCE_GLOBALNET,
ResourceType,
0,
NetResource,
EnumHandle) = NO_ERROR then begin
try
BufSize := $4000; // 16 kByte
GetMem(List, BufSize);
try
repeat
Entries := DWord(-1);
FillChar(List^, BufSize, 0);
Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
if Res = ERROR_MORE_DATA then
begin
ReAllocMem(List, BufSize);
end;
until Res <> ERROR_MORE_DATA;
Result := Res = NO_ERROR;
if not Result then
begin
FreeMem(List);
List := Nil;
Entries := 0;
end;
except
FreeMem(List);
raise;
end;
finally
WNetCloseEnum(EnumHandle);
end;
end;
end;


procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings);
procedure ScanLevel(NetResource: PNetResource);
var
Entries: DWord;
NetResourceList: PNetResourceArray;
i: Integer;
begin
if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try
for i := 0 to Integer(Entries) - 1 do
begin
if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or
(NetResourceList[i].dwDisplayType = DisplayType) then begin
List.AddObject(NetResourceList[i].lpRemoteName,
Pointer(NetResourceList[i].dwDisplayType));
end;
if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
ScanLevel(@NetResourceList[i]);
end;
finally
FreeMem(NetResourceList);
end;
end;
begin
ScanLevel(Nil);
end;





// Sample
procedure TForm1.Button1Click(Sender: TObject);
begin
ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, ListBox1.Items);
end;

djscsi
پنج شنبه 09 خرداد 1387, 10:48 صبح
ممنون b_yaghoobi گل دارم میرم کد رو امتحان کنم
من یه سوال دیگه در این زمینه دارم اونم اینه که من وقتی client رو اجرا میکنم اگر قبلش server اجرا نشده باشه ارور asynchronous socket error 10061 میده چطور میشه کاری کرد که این ارور نیاد
در کل من میخام از بدونم از روی server چه کنترلی میشه روی client انجام داد و برعکس
مثلا چطور به client یگم که اگه server خاموش بود فلان کار رو بکنه
ممنون

djscsi
پنج شنبه 09 خرداد 1387, 11:08 صبح
اقا امتحان کردم شد:تشویق:
فقط کجاشو تغییر بدم که به جای اسم اونها ip شو نوشته بشه:متفکر:
و یه سوال بچه گونه:خجالت:
همونطور که دیدید ip ها در یک listbox زیر هم نوشته میشه حالا من می خام بگم که اگه روی فلانip کلیک شد به اون پیغام بفرسته الان جوریه که اگه روی اولین ip کلیک کنم (اولین ip که به سرور پیام میفرسته) میتونم بهش پیام بفرستم ولی روی هر کدوم دیگه که کلیک می کنم و دکمه send رو میزنم انگار نه انگار
این کد سرور هست البتهه منهای کد b_yaghoobi

procedure TServerForm.FormCreate(Sender: TObject);
begin
ServerSocket1.Port := 23;
ServerSocket1.Active := True;
end;

procedure TServerForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Active := false;
end;

procedure TServerForm.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var i,d:integer;
begin
{*d:=0;
for i:=0 to listbox1.ItemIndex do begin
if listbox1.items.Text=serversocket1.Socket.RemoteAdd ress then break;
d:=d+1;
end;
if d>=listbox1.ItemIndex then *}
listbox1.items.add(Socket.RemoteAddress);
Memo1.Lines.Add(Socket.RemoteAddress);
Memo1.Lines.Add(Socket.ReceiveText);
Memo1.Lines.Add('');
end;

procedure TServerForm.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to (Serversocket1.Socket.ActiveConnections)-1 do
Begin
if Serversocket1.Socket.Connections[i].RemoteAddress=listbox1.Items.Strings
[listbox1.itemindex] then
// showmessage('Client Found in num '+inttostr(i)+' and Remot add '+Serversocket1.Socket.Connections[i].RemoteAddress);
begin
Serversocket1.Socket.Connections[i].SendText(Edit2.Text+'sent');
Memo1.Lines.Add(ServerSocket1.Socket.LocalAddress) ;
memo1.Lines.add(edit2.text);
Memo1.Lines.Add('');
end;
break;
end;
end;

procedure TServerForm.Button2Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to (Serversocket1.Socket.ActiveConnections)-1 do
Begin
if Serversocket1.Socket.Connections[i].RemoteAddress=listbox1.Items.Strings
[listbox1.itemindex] then
// showmessage('Client Found in num '+inttostr(i)+' and Remot add '+Serversocket1.Socket.Connections[i].RemoteAddress);
Serversocket1.Socket.Connections[i].SendText(Edit2.Text);
break;
end;
end;
ممنون

djscsi
پنج شنبه 09 خرداد 1387, 11:28 صبح
ببخشید 2 بار فرستادم