ورود

View Full Version : سوال: ارسال یک رشته ی wchar_t از طریق ()send



vasilopita
سه شنبه 16 مهر 1392, 19:25 عصر
سلام. من یک فایل درام که حاوی رشته های unicode ه. می خوام اطلاعات فایل رو بخونم و از طریق winsock و تابع send اونها رو ارسال کنم. تو گوگل گشتم اینو هم پیدا کردم :

// sender

// I have omitted all needed calls to WSAStartup(), socket(), connect() etc,
// which are all needed to establish a connection to recipient

w_char wideArray[100];
int sentSoFar = 0;
int needToSend = 2*100;
char* addr = (char*) wideArray;
while (sentSoFar<needToSend)
{
int iRet = send( s_Socket, addr+sentSoFar, needToSend-sentSoFar, 0 );
if ( iRet == SOCKET_ERROR )
{
/* handle the error */
}
sentSoFar += iRet;
}
ولی می خوام ببینم راه حل بهتری وجود نداره؟!ممنون

vasilopita
یک شنبه 21 مهر 1392, 18:56 عصر
از اساتید کسی نیست جواب ما رو بده!؟
من الان با استفاده از تابع wcstomps داده ی wchar_t* رو به char* تبدیل می کنم و از طریق تابع send اون رو ارسال می کنم. ولی مشکلم اینجاست که وقتی داده ای رو که از فایل می خونم فارسی باشه تابع wcstomps نمی تونه اونو تبدیل کنه. حالا راهحل چیه؟
پیشاپیش ممنون از راهنماییتون

rahnema1
دوشنبه 22 مهر 1392, 06:05 صبح
از اساتید کسی نیست جواب ما رو بده!؟
من الان با استفاده از تابع wcstomps داده ی wchar_t* رو به char* تبدیل می کنم و از طریق تابع send اون رو ارسال می کنم. ولی مشکلم اینجاست که وقتی داده ای رو که از فایل می خونم فارسی باشه تابع wcstomps نمی تونه اونو تبدیل کنه. حالا راهحل چیه؟
پیشاپیش ممنون از راهنماییتون

در ابتداي برنامه اين رو بذاريد


setlocale( LC_ALL, "Farsi" );


بعدش هم
کدپيج اون فايلي که توش فارسي نوشته شده را به windows-1256 تغيير بدهيد تا داده ها 8 بيتي باشند موقعي که فايل رو save ميکنيد بايد در اديتورتون گزينه اي واسه اين کار باشه
تا ببينيم جواب ميده يا نه

vasilopita
دوشنبه 22 مهر 1392, 13:31 عصر
در ابتداي برنامه اين رو بذاريد


setlocale( LC_ALL, "Farsi" );


بعدش هم
کدپيج اون فايلي که توش فارسي نوشته شده را به windows-1256 تغيير بدهيد تا داده ها 8 بيتي باشند موقعي که فايل رو save ميکنيد بايد در اديتورتون گزينه اي واسه اين کار باشه
تا ببينيم جواب ميده يا نه

ممنون دوست عزیز. ولی مشکل من خوندن یا نوشتن فارسی از/در فایل نبود. مشکل من این بود که تو تابع send فقط میشد از داده ای *char استفاده کرد.
در هر صورت خودم مشکل رو حل کردم ؛راحت تر از اونچه که تصورش رو می کردم.
فرستنده:
send(intsocket,(char*) wbuffer + buffer_sent, sizeof(wchar_t)*NeedToSend, 0);
گیرنده:
interror=recv(intsocket,(char*)wrecbuffer,MAX_PATH ,0);
wrecbuffer[interror/2]='\0';

Vitallity
دوشنبه 22 مهر 1392, 14:04 عصر
منظور از (char*) این نیست که نوع اطلاعاتی که می‌فرستی char هست. در اصل اون اولین آدرس به بایتی هست که اطلاعات در حافظه موجود هست. و با sizeof هم مشخص می‌کنی که این پوینتر تا چه حد از اطلاعات رو باید از روی حافظه بخونه و منتقل کنه...

vasilopita
دوشنبه 22 مهر 1392, 14:58 عصر
منظور از (char*) این نیست که نوع اطلاعاتی که می‌فرستی char هست
خیر. send داده ای رو که می فرسته کار نداره char یا wchar چون داده ها رو بصورت byte ارسال میکنه. تنها چیزی که اینجا اهمیت داره اینه که داده ای که اینجا ارسال میشه دوبرابر مقدار سایزی هست که براش در نظر گرفته میشه. یعنی اگه داده ی wchar ما که قصد ارسالش رو داریم 120 byte چیزی که ارسال میشه 240 هستش.

Vitallity
پنج شنبه 25 مهر 1392, 01:11 صبح
خیر. send داده ای رو که می فرسته کار نداره char یا wchar چون داده ها رو بصورت byte ارسال میکنه.
جواب من رو یه بار دیگه بخونید... : )

اوه جواب شما رو دیر دیدم...
با توجه به این خط :
int needToSend = 2*100;

و این خط:

send(intsocket,(char*) wbuffer + buffer_sent, sizeof(wchar_t)*NeedToSend, 0);


شما داری سایز ثابتی رو می‌فرستی که سایزش اگر اشتباه نکنم می‌شه 800 بایت.
بعد نوشتن یک کد با ثبات، بدون باگ در سطح پایینی مثل سوکت کار زمان‎بر و پر ریسکی هست. چرا از Boost::asio (http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio.html) استفاده نمی‌کنی یا حتی از کلاس‌های شبکه Qt استفاده نمی‌کنی؟