در این پروژه، باید یک سامانه نظرسنجی آنلاین برای بازیهای شهرآورد طراحی کنید که از طریق سوکتها، ارتباط بین یک سرور و چندین کلاینت را مدیریت کند. هر کلاینت باید بتواند به سرور متصل شده و به یک گزینه رأی دهد. پس از پایان رأیگیری، سرور باید نتایج را جمعآوری و به کلاینتها اعلام کند.
![شهرآورد](https://quera.org/qbox/view/0o1NNQFj3c/Q3-01.svg)
# پروژه اولیه
پروژهی اولیه را میتوانید از [این لینک](/problemset/assignments/4367/download_problem_initial_project/261558/) دانلود کنید. ساختار این فایل به صورت زیر است:
```
vote.zip
├── client.c
└── server.c
```
# نحوهی اجرا کردن پروژه
بعد از اجرا کردن دستورهای زیر به ترتیب `server` و `client` راهاندازی میشوند.
```
gcc -std=gnu11 -o server server.c -lpthread
./server <port>
gcc -std=gnu11 -o client1 client.c
./client1 <port>
gcc -std=gnu11 -o client2 client.c
./client2 <port>
...
```
# جزئیات پیادهسازی
## راهاندازی سرور
+ سرور باید بتواند چندین کلاینت را به صورت همزمان مدیریت کند.
+ سرور باید روی پورت `<port>` تنظیم شود که مقدار آن بهصورت آرگمان ورودی داده میشود.
+ اگر هنگام ساختن سوکت با خطا مواجه شد **بلافاصله** خطای `Socket Error` را چاپ کند.
+ اگر این پورت قابل استفاده نیست **بلافاصله** خطای `Bind Error` را چاپ کند.
+ در صورتی که هیچ کدام از خطاهای بالا رخ نداد،سرور باید بعد از راهاندازی **بلافاصله** پیام `Ready To Get Votes...` را به صورت استاندارد چاپ کند.
پس از اتصال هر کلاینت، سرور باید متن و گزینههای نظرسنجی را به هر کلاینت ارسال کند و از آنها درخواست کند که یک عدد (نمایانگر گزینه) را به عنوان رای انتخاب کنند. متن پیام نظرسنجی باید عبارت زیر باشد:
```
Who Is Winner?
1.Persepolis
2.Esteghlal
```
سرور پس از دریافت رأی از هر کلاینت، باید رأی را ذخیره کرده و **بلافاصله** پیام `We Got Your Vote.` را برای تأیید رأی به کلاینت ارسال کند. در صورتی که رأی کاربر برابر `1` یا `2` نیست. **بلافاصله** عبارت `Invalid Vote.` را باید به کلاینت ارسال کند.
سرور پس از دریافت هر رأی از از کلاینتها، نتیجهی رایگیری را بهصورت زیر چاپ کند.
```
Current Votes: Persepolis: 6 Esteghlal: 4
```
## کلاینت
+ هر کلاینت باید از طریق همان `<port>` بتواند به سرور متصل شود و گزینههای رأیگیری را دریافت کند.
+ کلاینت باید بتواند یکی از گزینهها را انتخاب کرده و آن را به سرور ارسال کند.
+ پس از ارسال رأی، کلاینت باید پیام تأیید رأی را از سرور دریافت کند.
## شرایط و محدودیتها
+ برای مدیریت هر کلاینت باید از یک *thread* یا پروسه جداگانه در سرور استفاده شود.
+ از پروتکل *TCP* برای ارتباط پایدار و از `send` و `recv` برای ارسال و دریافت دادهها استفاده شود.
# آنچه باید آپلود کنید
```
[your-solution-file-name].zip
├── client.c
└── server.c
```