-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDocument.txt
65 lines (41 loc) · 7.8 KB
/
Document.txt
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
برای انتقال فایل در این پروژه نیاز به پیاده سازی دو مفهوم کلی بود
1. server / client
2. MultiProcess / MultiThread
موضوع اول به نوعی ارتباط شبکه ای بین دو سیستم اشاره میکند که کلاینت اطلاعات را توسط شبکه و ip به عنوان شناسه هرنقطه از شبکه به نقطه دیگر انتقال میدهد. حال این ip می تواند آی پی خود سیستم و یا آی پی سیستم دیگری که در شبکه با کامپیوتر درارتباط هستند باشند.
برای پیاده سازی این بخش socket در فایل های server و client ارتباط میان این دو بخش را ایجاد می کنند.
بخش بعد مربوط به پیاده سازی برنامه نویسی multiprocess و multithread می باشد. هرفایل که ارسال می شود، قبل از ارسال باید به بخش های مجزا و برابر تقسیم شود و سپس هریک از فایل ها وارد بخش نتورک شده و به سرور ارسال می گردد.
درنهایت جهت استفاده از این برنامه، در ترمینال سیستم فرستنده باید فایل multithreadedfiletransfer.out را ران کنیم.اطلاعات کامل درباره نحوه ران کردن برنامه در فایل help.txt نیز موجود می باشد که با اجرای دستور
./bin/multithreadedfiletransfer.out --help
نیز قابل نمایش است.
علاوه بر کد بالا که کلاینت را مشخص میکند و کاربر فایل های دلخواه خود برای انتقال و تعداد thread ها را مشخص میکند، نیازمند به اجرای فایل server.out نیز هستیم. درصورتی که این فایل در سیستم خود کلاینت ران شود، آدرس آی پی باید 127.0.0.1 ست شود ولی جهت انتقال فایل ها به سیستم دیگر در شبکه، فایل سرور باید در آن سیستم ران شده و آدرس ip آن نیز در دستور multithreadedfiletransfer.out وارد شود تا انتقال صورت گیرد. فایل های ارسال شده در دایرکتوری ای که فایل سرور ران شده قرار میگیرد.اتصال میان دو سیستم نیز میتواند توسط کابل یا hotspot و یا سایر روش های اتصال شبکه ای صورت گیرد.
حال به بررسی فایل client.c می پردازیم
توابع تعریف شده در این فایل به شرح زیر هستند:
GetFileName:
این تابع با گرفتن مسیر یک فایل، اطلاعات قبل از نام فایل را پاک کرده و درنهایت نام فایل را باز میگرداند.
FindSize:
در این بخش با گرفتن مسیر یک فایل، سایز آن را باز میگرداند.
FileSplitter:
این تابع آدرس یک فایل، نام و تعداد بخش های مورد نیاز را میگیرد، در ادامه با باز کردن آن فایل و با توجه به تعداد بخش های مورد نیاز، آن را بافر ریخته و سپس آن را در یک فایل ذخیر میکند. در نتیجه پس از پایان تابع فایل اصلی یه تعدادی دلخواه فایل مساوی تقسیم شده که هریک در آخر نام خود شماره مربوط به فایل و ترد را ذخیره کرده اند.
isNumeric:
این تابع یا گرفتن یک رشته، هرکاراکتر را خوانده و با کاراکتر های عددی مقایسه میکند و درصورت درست بودن همه آنها، آن رشته را قابل تبدیل به عدد تشخیص میدهد.
send_file:
هدف این تابع، پیاده سازی برنامه نویسی چندنخی روی هرفایل است. نام فایل ارسالی ابتدا تعیین می شود. سپس بعد از تقسیم بندی و افزودن هدر به آنها، که در انتها از آن جهت شناسایی و چسباندن فایلها استفاده می شود، فایل های جدید همراه با هدر خود به ترد های جداگانه تبدیل شده و به تابع بعدی یعنی send_chunk فرستاده میشوند.
send_chunk:
این تابع فایل ارسالی از تابع قبل را بررسی میکند، درصورت مشکل نداشتن آن را به اندازه های مساوی تقسیم کرده و بعد از اتصال هدر به آنها، آن را به سرور ارسال میکند.
send_file_count:
مجموع تعداد فایل های تست (برای پیدا کردن بهینه ترین تعداد ترد) و فایل های ارسالی کاربر (برای فورک شدن) را به سرور میفرستد تا سرور منتظر دریافت آنها باشد و بعد از آن غیرفعال شود.
main:
دستورات ابتدایی تابع مین، مربوط به ورودی گرفتن و حالت های متفاوت آن است که براساس آن برنامه می تواند از فیچر های مختلف خود مانند -r, -c , -h استفاده کند. علاوه برآن تابع باید مقادیر dest_ip، source_path و chunk را به دست آورد تا در سایر بخش ها از آن استفاده کند.
در ابتدا تابع سوکت را باز میکند تا توانایی برقرار کردن ارتباط و استفاده از شبکه محلی فراهم شود و سپس در این مراحل درصورتی که کاربر تعداد ترد ها را مشخص نکرده بود، برنامه با تست مقادیر مختلف از 1 تا 64 بهترین سرعت را مچبا توجه به وضعیت فعلی شبکه محاسبه کرده و آن مقدار را به صورت دیفالت ست میکند. در یخش دیگر در صورتی که چند فایل به عنوان ورودی جهت انتقال داده شده باشد، برنامه به کمک multiprocessing هریک را به یک پراسس جداگانه میدهد.
در ادامه این تابع فایل ها را به تابع FileSplitter میدهد تا به بخش های مختلف بر اساس تعداد چانک تقسیم شوند و سپس تابع send_file را برای آن فایل فراخوانی میکند.
در نهایت بعد از تمام شدن تمام پراسس ها، سوکت بسته شده و برنامه از سمت کلاینت خاتمه می یابد.
در ادامه فایل server.c را داریم که دریافت کننده فایل هاست و آنها را در دایرکتوری خود ذخیره میکند.
توابع موجود در این برنامه به این شرح است:
is_digit:
این دسته کد برای تعیین این است که آیا یک رشته قابلیت تبدیل به کاراکترهای عددی را دارد یا خیر.
در این صورت عدد یک را باز میگرداند.
command_handler:
در این تابع ابتدا بخش های header و content را جدا کرده و سپس بر اساس دستوری که تابع از هدر می خواند، تعیین میکند که با کانتنت دریافت شده چه عملی باید انجام دهد.
این تابع در واقع دریچه ورود به سرور است و نقش تبادل سمت سرور را بر عهده دارد.
merge:
این تابع در پایان مقادیر ارسالی از سوی کلاینت اجرا می شود. در زمانی که تمام پکت ها ارسال شده اما به دلیل استفاده از thread آنها در فایل های جدایی هستند، این تابع آنها را در یک فایل به نام اصلی خود ذخیره میکند.