View Full Version : مشكل در win sock
m4hd1r
جمعه 11 شهریور 1390, 16:10 عصر
سلام
من تو برنامم كه از يه سرور و يه كلاينت تشكيل شده ميخواستم يه فايل بفرستم
قراره كه چجد با ديتا از كلاينت به سرور سند بشه اما نميشه و فقط يه بار data arrival (اميدوارم درست نوشته باشم) فراخوني ميشه
يه تيكه از برنامه كلاينت
Do Until f = LOF(1)
f = f + 1
Winsock1.SendData s(f)
Loop
ديباگ هم ميكنم به تعداد سند ميشه ديتا ولي اونور يه با بيشتر ارايو نميشه مشكل چيه؟:لبخند:
_behnam_
جمعه 11 شهریور 1390, 16:38 عصر
شما وقتی از این طرف تیکه تیکه میفرستی انتظار نداشته باش اونترف هم توی data arrival تیکه تیکه دریافت بشه ممکنه هر چندتا تیکه یاهم دریافت بشه توی توی
Protocol TCP اینجوریه یعنی وقتی دیتا به درستی ارسال نشد دوباره ارسال میشه تا اینکه دیتا بدرستی برسه
m4hd1r
جمعه 11 شهریور 1390, 18:23 عصر
الان بايد چيكار كنم كه درست شه؟:لبخند:
_behnam_
جمعه 11 شهریور 1390, 19:01 عصر
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim gData, Data As String
Winsock1.getData gData, vbString, bytesTotal
Data = Data & gData
MsgBox Data
End Sub
Mr'Jamshidy
شنبه 12 شهریور 1390, 10:20 صبح
دوست عزیز مشکل شما فقط اینه که زمانی که میخوا تیکه تیکه بفرستی صبر نمیکنی تا پاکت قبلی کامل ارسال بشه و پاکت بعدی رو میفرستی
Do Until f = LOF(1)
f = f + 1
Winsock1.SendData s(f)
Loop
این کد اشتباهه چون همه پاکل ها رو بلافاصله میفرسته
این کد صبر میکنه تا Winsock آزاد بشه بعد پاکت بعدی رو میفرسته
Do Until f = LOF(1)
If Not Winsock1.State = sckInProgress Then
f = f + 1
Winsock1.SendData s(f)
End If
Loop
M.T.P
شنبه 12 شهریور 1390, 12:10 عصر
ارسال صحیح یک فایل:
Sub SendFile()
Dim StrData As String
Dim StrFile As String
Dim IntFile As Integer
StrFile = "C:\Ax.jpg"
IntFile = FreeFile
Open StrFile For Binary Access Read As IntFile
StrData = Input(LOF(IntFile), #IntFile)
Close IntFile
Winsock1.Senddata StrData
End Sub
Mr'Jamshidy
شنبه 12 شهریور 1390, 12:50 عصر
ارسال صحیح یک فایل:
Sub SendFile()
Dim StrData As String
Dim StrFile As String
Dim IntFile As Integer
StrFile = "C:\Ax.jpg"
IntFile = FreeFile
Open StrFile For Binary Access Read As IntFile
StrData = Input(LOF(IntFile), #IntFile)
Close IntFile
Winsock1.Senddata StrData
End Sub
دوست عزیز این ارسال صحیح که شما میگید زمانی درست عمل میکنه که فایل شما حد اکثر 8 کیلو بایت باشه (اگر اشتباه نکنم)
اگر شما یک فایل 200 مگابایتی بخواین بفرستین باید فایل تیکه تیکه بشه (Split) بعد بسته بسته ارسال بشه
وگرنه فایل 200 مگابایتی یهو ارسال نمیشه
موفق باشید
M.T.P
شنبه 12 شهریور 1390, 13:03 عصر
دوست عزیز این ارسال صحیح که شما میگید زمانی درست عمل میکنه که فایل شما حد اکثر 8 کیلو بایت باشه (اگر اشتباه نکنم)
اگر شما یک فایل 200 مگابایتی بخواین بفرستین باید فایل تیکه تیکه بشه (Split) بعد بسته بسته ارسال بشه
وگرنه فایل 200 مگابایتی یهو ارسال نمیشه
شما هر مقدار دیتا رو به SendData بدین ارسال میکنه و عمل Split کردن رو خودش عهده دار میشه اما در مقصد بنا به سرعت کارت شبکه دیتا دریافت میشه که معمولا زیر 5 کیلوبایت هست و برای فایل های بالای یک مگابایت باید مدتی رو منتظر موند.
البته راه های دیگه هم هست که میشه سرعت تبادل اطلاعات رو افزایش داد و اون ساختن آرایه از وینسوک در مبدا و مقصد ، تیکه کردن فایل و تقسیم بین سوکت ها و سپس ارسال و دریافت(کاری که نرم افزارهای دانلود انجام میدهند)
m4hd1r
شنبه 12 شهریور 1390, 15:37 عصر
@ مستر جمشيدي
مغز من با كد شما مشكل نداره ولي وقتي ديباگ ميكنم سند ميشه ولي تا پايان حلقه در اونطرف arrive فراخواني نميشه!؟ يعني صبر ميكنه تا تموم شه!
***حلقه اصلاح ميشه تا پايان ساب
_behnam_
شنبه 12 شهریور 1390, 16:05 عصر
از روشی که آقای M.T.P فرمودن استفاده کن شلید مشکلت حل بشه
m4hd1r
شنبه 12 شهریور 1390, 23:27 عصر
آره درست شد ببخشيد من كد آقاي ام تي پي رو اشتباه نوشته بودم ......خيلي ممنون از همه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.