PDA

View Full Version : حرفه ای: مشکل با برنامه نویسی سوکت



NIMA_1981
شنبه 19 فروردین 1391, 17:12 عصر
سلام دوستان یک سوال تخصصی دارم اگه راهنمایی کنید ممنون میشم -

من میخوام یک برنامه بصورت سرور بنویسم که با برنامه کلاینت بتونم به اون وصل بشم
اولا من تو محیط لینوکس برنامه نویسی میکنم - قسمت اول این کار که دو تا برنامه با هم ارتباط برقرار کنن را انجام دارم و برنامه سرور و کلاینت میتونن برای هم ‍‍‍‍‍متن ارسال کنن
اما مشکل من اینجا شورع میشه - من میخوام یک برنامه سرور داشته باشم که تعداد نامحدودی کلاینت بتونه به اون وصل بشه - حالا برای این کار باید هر کلاینت با یک ‍‍‍‍یورت خاص به اون وصل بشه و این کار باید هم زمان باشه چون ممکنه در هر لحظه جند برنامه کلاینت به این سرور وصل باشه
http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/148791.gif

ممنون میشم اگه راهنمایی کنید

NIMA_1981
یک شنبه 20 فروردین 1391, 09:52 صبح
دوستان کسی روی این موضوع کار نکرده !!

cpppro
دوشنبه 21 فروردین 1391, 10:10 صبح
سلام
به نظرم باید از Multi threading استفاده کنین.
یعنی برنامه سرور برای هر در خواست از طرف کلاینت یک ترد اختصاص بده.برای این کار هم روشهای مختلفی هست.یکی همین ایجاد ترد معمولی یکی استفاده از thread pool و ...
راستش من الان پروژه ای که دارم کار میکنم مربوط به سوکت پروگرمینگ هست.ولی روی زبان سی شارپه.هرچند زیادم مفاهیم فرق ندارن.
البته این رو هم بگم برای مالتی ترد کردن برنامه هم باید یه مدت کلا وقت بزارین و روی خطاهای چند نخی کردن برنامه کار کنین.اگه برنامه گرافیکی باشه شاید کارتون بیشتر هم باشه.

ایجارم بد نیست نگا کنین :

http://www.codeproject.com/KB/IP/#Client%2fServer+Development

http://www.codeproject.com/KB/threads/


خدانگهدار

amin1softco
دوشنبه 21 فروردین 1391, 23:12 عصر
من میخوام یک برنامه سرور داشته باشم که تعداد نامحدودی کلاینت بتونه به اون وصل بشه
تابع fork() برای ساخت ترد ها در لینکس به کار می ره من زیاد کار نکردم

- حالا برای این کار باید هر کلاینت با یک ‍‍‍‍یورت خاص به اون وصل بشه و این کار باید هم زمان باشه چون ممکنه
چرا؟! مگه نمی تونند از طریق یک پورت وصل بشند؟! شما باید از طریق یک پورت وصل بشید و برنامه سرورتون بتونه چیلد هایی که درست کرده رو مدیریت کنه مثلاً یک سرور فایل یک پورت داره و همه به اون کانکت می شند

NIMA_1981
چهارشنبه 23 فروردین 1391, 19:40 عصر
تابع fork() برای ساخت ترد ها در لینکس به کار می ره من زیاد کار نکردم

چرا؟! مگه نمی تونند از طریق یک پورت وصل بشند؟! شما باید از طریق یک پورت وصل بشید و برنامه سرورتون بتونه چیلد هایی که درست کرده رو مدیریت کنه مثلاً یک سرور فایل یک پورت داره و همه به اون کانکت می شند
در مورد اینکه همه می تون به یک پورت وصل بشن بله فرمایش شما درسته من این قسمت رو اشتباه نوشتم اما در مورد اینکه این برنامه همیشه آماده حواب دادن باشه در کل باید از چه روشی استفاده کنم که بهتر باشه

sh4mid
چهارشنبه 23 فروردین 1391, 23:00 عصر
سلام
اگه تو Windows کد مي زدي بهت I/O Completion Ports (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx) رو پيشنهاد مي کردم
ولي داري تو Linux کد ميزني ، Linux هم معادلي براي اين مدل نداره
اما ميتوني از
Boost.Asi (http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio.html)o
libevent (http://libevent.org/)
epoll (http://en.wikipedia.org/wiki/Epoll)
Kqueue (http://en.wikipedia.org/wiki/Kqueue)
استفاده کنی
برای مطالعه بیشتر
Fast portable non-blocking network programming with Libevent (http://www.wangafu.net/~nickm/libevent-book/)
How to use epoll? A complete example in C (https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/)

NIMA_1981
پنج شنبه 24 فروردین 1391, 00:03 صبح
سلام
اگه تو Windows کد مي زدي بهت I/O Completion Ports (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx) رو پيشنهاد مي کردم
ولي داري تو Linux کد ميزني ، Linux هم معادلي براي اين مدل نداره
اما ميتوني از
Boost.Asi (http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio.html)o
libevent (http://libevent.org/)
epoll (http://en.wikipedia.org/wiki/Epoll)
Kqueue (http://en.wikipedia.org/wiki/Kqueue)
استفاده کنی
برای مطالعه بیشتر
Fast portable non-blocking network programming with Libevent (http://www.wangafu.net/~nickm/libevent-book/)
How to use epoll? A complete example in C (https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/)
ممنون از راهنمایی شما - من توی لینوکس برنامه مینویسم - اما در مورد لینک هایی که شما معرفی کردید - من باید از کتابخانه های استاندارد استفاده کنم - مشکل در نخوه ساخت برنامه تخت شبکه نیشت فقط مشکل در ساخت این قسمت که برنامه بتونه در هر لحظه به هر تعداد کلاینت مه به اون وصل میشه پاسخ مناسب بده - یکی از دوستان پیشنهاد استفاده از Multi threading را داده که من دقیقا متوجه فرق اون با fork() چیه ؟؟

amin1softco
پنج شنبه 24 فروردین 1391, 07:22 صبح
وقتی یک برنامه در سرور اجرا بشه و بره در حالت لیستن تا وقتی بسته نشده می تونه به تمام در خواست ها پاسخ بده!!!

خوب جفتش یکیه دیگه تقریباً Multi threading چند نخی یک مفهومه حالا بسته به اینکه شما چطوری پیادش کنید در لینوکس و ویندوز توابع مختلفی براش در نظر گرفته شده در یونیکس و لینوکس فک کنم از تابع fork برای این مورد استفاده می شه.
http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html

NIMA_1981
شنبه 26 فروردین 1391, 01:33 صبح
دوستان سلام - ممنون ار راهنمایی همه شما من کد رو به این شکل نوشتم الان به نظر من درست کار میکنه کد را اینجا قرار میدم میشه نظر بدید که ایا درست این کارو انجام دادم

#include <iostream>
#include <string>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include "fsocket.cpp"
using namespace std;
int main(void)
{
int const STRLEN = 256;
int choice;
int port=6666;
char *ipAddress="127.0.0.1";
char recMessage[STRLEN];
char sendMessage[STRLEN];
int pid;
cout<<"Waiting for Connect...."<<endl;
ServerSocket sockServer;
sockServer.StartHosting(port);
for(;;){
sockServer.Listen();
sockServer.ReciveData(recMessage,STRLEN);
cout<<"Message--> "<<recMessage<<endl;
sockServer.SendData("message send from server");
switch(fork())
{
case -1:
perror("fork");
sockServer.CloseConnection();
exit(EXIT_FAILURE);
case 0: // Child process
sockServer.CloseConnection();
exit(0);
default: // Parent process
sockServer.CloseConnection();
continue;
}
}
}




با تشکر - قسمت fork

NIMA_1981
شنبه 26 فروردین 1391, 14:37 عصر
سلام دوستان - من با این کد بالا که نوشتم مشکل دارم وقتی با ۲ تا سیستم به این برنامه کانکت میکنیم هر درو برنامه سما کلاینت کانکت میشه اما فقط ‌پیام از سیستمی میگیره که اول وصل شده باشه میشه بکید کجا کد خطا داره با تشکر

amin1softco
شنبه 26 فروردین 1391, 21:56 عصر
ببنید شما پورتی که دارید یک منبع محسوب می شه و باید بین نخ هایی که ایجاد میک نید به نوبت با سمافور یا signal و wait این منبع رو به چیلد هایی که ایجاد می کنید تقسیم کنید. و گرنه یک نخ همیشه اون منبع رو در دست داره
http://alas.matf.bg.ac.rs/manuals/lspe/snode=95.html

NIMA_1981
شنبه 26 فروردین 1391, 23:55 عصر
ممنون از راهنمایی شما من کد را به این شکل تغییر دادم الان برنامه درست کار میکنه میتونه در هر لحطه جند کلاینت به اون وصل بشه


int main(void)
{
int const STRLEN = 256;
int choice;
int port=6666;
char *ipAddress="127.0.0.1";
char recMessage[STRLEN];
char sendMessage[STRLEN];
int pid=0;

char *cid="connect to server";
cout<<"Waiting for Connect...."<<endl;
ServerSocket sockServer;
sockServer.StartHosting(port);
for(;;){

sockServer.Listen();
sockServer.ReciveData(recMessage,STRLEN);


switch(fork())
{
case -1:
perror("fork");
sockServer.CloseConnection();
exit(EXIT_FAILURE);
case 0: // Child process
pid++;
cout<<"child:"<<pid<<endl;
cid="conect to server";
sockServer.SendData(cid);
cout<<"Message--> "<<recMessage<<endl;

default: // Parent process

cout<<"parent:"<<pid<<endl;
sockServer.CloseConnection();
continue;
}
}
}




فقط میشه در مورد استفاده از سیگنال بگید که چه کارایی هایی داره و کلا به چه درد میحوره - چون توی جند تا نمونه کد دیدم که از این سیگنال استفاده شده به این شکل


void handleSig(int signum)
{
while(waitpid(-1, NULL, WNOHANG) > 0);
}



و داخل نابع اصلی هم به این شکل پیاده سازی شده

signal(SIGCHLD, handleSig);


با تشکر

amin1softco
یک شنبه 27 فروردین 1391, 08:47 صبح
ببنید وقتی یک منبع بحرانی داشته باشیم (یعنی در آن واحد فقط یک پروسس یا نخ بتونه ازش استفاده کنه) ما باید این انحصار متقابل رو پیاده کنیم. برای اینکار از سمافور یا مانیتور استفاده می کنند سمافور در سطح سیستم عامله و مانیتور در سطح برنامه کاربردی
و برای پیاده سازیش از signal و wait استفاده می شه . الان شما دوتا کلاینت دارید اما وقتی هزار تا شد نمی تونید به این راحتی کارتون رو انجام بدید و باید جلویه گرسنگی و بن بست و این مفاهیم که در درس سیستم عامل مطرح می شه رو بگیرید . برای همین از signal و wait استفاده می شه همین مسائل معروفش خوانندگان و نویسندگان یا غذا خوردن فیلسوف ها و غیره است سرچ کنید بهتر به نتیجه می رسید.

NIMA_1981
یک شنبه 27 فروردین 1391, 09:04 صبح
با تشکر از توضیحات شما نحوه پیاده سازی به همون طریقی ایت که در پست قبلی گفتم