سؤال

أنا باستخدام لغة C وهو منصة مشتركة لكل من الملقم والعميل.

لدي هيكل من نوع معين الذي أريد أن ترسل إلى العميل من الملقم.

مثلا

رمز الملقم

 //necessary declarations

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,&hp,sizeof(hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

رمز العميل

struct hostent *hp;

msg=recvfrom(mysock,&hp,sizeof(hp),0,(struct sockaddr)&serv_addr,&size_len);

لذا أساسا اريد ارسال هيكل من الملقم إلى العميل.ولكن من فوق قطعة من التعليمات البرمجية أنا على الحصول على تجزئة أخطاء وأنا لست متأكدا ما إذا كان هذا الهيكل نقل ممكنا.هل هناك أي طريقة للخروج ؟

هل كانت مفيدة؟

المحلول

أولا يجب أن malloc() من أجل تخصيص الذاكرة البنية hostent.يمكنك نقل البنية من خلال sendto()/recvfrom() ولكن لأن البنية hostent يحتوي على مؤشرات أعضاء هذه البنية التي هي مؤشرات لا معنى لها في أقرب وقت يتم نقلها إلى الطرف الآخر.

نصائح أخرى

أود إزالة & أمام hp

بشكل عام كنت ترغب في تجنب نقل الخام الهياكل عبر الشبكات إلا إذا كان لديهم على وجه التحديد تم استخدام شبكة النقل ، أو إلا إذا كنت متأكدا تماما من أن كلا الطرفين سوف دائما يكون بالضبط نفس العمارة.الاختلافات في الحشو بايت الطلب قد يسبب ظهور البيانات مشوه في الطرف الآخر.نوع معين من البنية تحاول نقل فقط لن تعمل إرسالها الخام (انظر الجواب من خلال بيتروس)

مشكلة في إرسال الرمز هو أن hp هو مؤشر وأنت التعامل معها كما هي البيانات النقاط.sizeof(hp) بإرجاع حجم المؤشر ، وليس حجم وأشار إلى hostent البنية.أيضا, يتم إنشاء مؤشر إلى مؤشر في الحجة الثانية من sendto عندما كنت لا أقصد أن.إرسال التعليمات البرمجية كما يلي:

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,hp,sizeof(*hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

لديك أيضا مشكلة في تلقي التعليمات البرمجية.كنت من المفترض أن تخصص مساحة recvfrom لتخزين البيانات الواردة.فإنه لا تخصيص ذلك لك.تغيير الخاص بك تتلقى رمز واحد من هذين:

// Store on the stack
struct hostent h;

msg=recvfrom(mysock,&h,sizeof(h),0,(struct sockaddr)&serv_addr,&size_len);

أو

// Store on the heap, be sure to free() when done
struct hostent * hp = malloc(sizeof(struct hostent));

msg=recvfrom(mysock,hp,sizeof(*hp),0,(struct sockaddr)&serv_addr,&size_len);

إذا hp هو مؤشر لماذا أخذ العنوان ؟

يجب تصحيح التعليمات البرمجية كما هو موضح أدناه:

struct hostent *p_hp = gethostbyname("www.google.com");
struct sockaddr_in cli_addr;
sendto(sockDes,p_hp,sizeof(hostent),0,(SOCKADDR *)&cli_addr,sizeof(cli_addr));


struct hostent hp;
struct sockaddr_in serv_addr;
int size_serv_addr = sizeof(serv_addr);
msg=recvfrom(mysock,&hp,sizeof(hostent),0,(SOCKADDR *)&serv_addr,&size_serv_addr);

وسوف تساعد دائما على قراءة الوثائق على مأخذ وظائف.

بالمناسبة إذا كنت تنظر في عام جدا السؤال في ما بعد ، أي"أريد أن أرسل هيكل من الخادم إلى العميل" ، أود أن أوصي تبحث في المشاركة التالية على ذلك:

يمر هيكل من خلال مآخذ في ج

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top