PDA

View Full Version : اين پارامتر تابع CONNECT() به چه شكل كار ميكنه؟



one hacker alone
پنج شنبه 25 اسفند 1390, 06:31 صبح
با ياد خداي شادي ها
سلام به دوستان برنامه نويس
من با اين ورودي تابع CONNECT مشكل دارم يعني نميتونم دركش كنم ميشه يكي توضيح بده چرا اينجوري مينويسيم


connect(newsock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr));

من با اشاره گر ها آشنايي دارم اما اين شكل استفاده در پارامتر دوم اين تابع براي من گنگ هست
پارامتر اول و سوم كار ندارم من با شكل پارامتر دوم مشكل دارم

پارامتر دوم ظاهرا داره يه متغير از نوع ساختمان sockaddr تعريف ميكنه كه اگه اينطوريه پس چرا به اين شكل؟

pe32_64
پنج شنبه 25 اسفند 1390, 20:28 عصر
من با اشاره گر ها آشنايي دارم اما اين شكل استفاده در پارامتر دوم اين تابع براي من گنگ هست
پارامتر اول و سوم كار ندارم من با شكل پارامتر دوم مشكل دارم

پارامتر دوم ظاهرا داره يه متغير از نوع ساختمان sockaddr تعريف ميكنه كه اگه اينطوريه پس چرا به اين شكل؟

تو پارامتر دوم شما به کامپایلر میگی که اشاره گر به متغییر sock_addr رو از نوع ساختار sockaddr در نظر بگیره.

one hacker alone
پنج شنبه 25 اسفند 1390, 22:27 عصر
ممنون خوب اين چيزي كه شما ميگين بايد به شكل زير باشه
struct sockaddr *sock_adddr

اما چون ما اين تعريف متغير رو در حالي انجام ميديم كه ميخوام از فراخواني با ارجاع استفاده كنيم همون لحظه هم ادرس اشاره گر رو با & بكار ميبريم و ميفرستيم كه نتيجه حاصل هموني هست كه توي كد بود درسته

حالا ما اگه بخوايم اين پارامتر دوم رو به يه شكل ديگه بنويسيم چجوري ميتونيم بنويسيم؟

pe32_64
جمعه 26 اسفند 1390, 00:05 صبح
ممنون خوب اين چيزي كه شما ميگين بايد به شكل زير باشه
struct sockaddr *sock_adddr

نه خیر!


اما چون ما اين تعريف متغير رو در حالي انجام ميديم كه ميخوام از فراخواني با ارجاع استفاده كنيم همون لحظه هم ادرس اشاره گر رو با & بكار ميبريم و ميفرستيم كه نتيجه حاصل هموني هست كه توي كد بود درسته

نه خیر! متغییر قبلا تعریف شده(ازنوع sockaddr_in) و اینجا فقط استفاده میشه.از فراخواني با ارجاع استفاده میشه و اشاره گر به نوع صحیح(ساختارsockaddr)تبدیل میشه.

sockaddr_in sock_addr;
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
sock_addr.sin_port = htons( 27015 );
connect(newsock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr));




حالا ما اگه بخوايم اين پارامتر دوم رو به يه شكل ديگه بنويسيم چجوري ميتونيم بنويسيم؟

باید اونو از نوع ساختارsockaddr تعریف کنیم که نیاز به تبدیل نوع هم نباشه.(روش قبل بهتره)

one hacker alone
جمعه 26 اسفند 1390, 09:18 صبح
يعني در واقع ما اينجا اومديم از تبديل نوع استفاده كرديم اما به جاي مثلا نوع int اومديم به نوع (struct sockadd* ) تبديلش كرديم درسته؟ خوب اول اينكه ما چرا اينجا اين تبديل رو انجام ميديم و دوم اينكه ميشه بگين چجوري اون رو از نوع ساختار sockaddr تبديل كنيم
ممنون از راهنماييتون

pe32_64
جمعه 26 اسفند 1390, 15:03 عصر
عني در واقع ما اينجا اومديم از تبديل نوع استفاده كرديم اما به جاي مثلا نوع int اومديم به نوع (struct sockadd* ) تبديلش كرديم درسته؟بله ،اما نوع int نه،نوع sockaddr_in .
جواب سوال بعدی هم نوع اون کد بالایی هستش.تبدیل برای راضی کردن کامپایلر استفاده می شه.
اشاره گر هارو تو c حتما برای socket نوشتن باید خوب بلد باشید.
موفق باشید.