सी

2013-07-23 3 views
7

में सॉकेट पर संरचना भेजें मैं क्लाइंट/सर्वर प्रोग्राम विकसित कर रहा हूं और मेरे क्लाइंट को सर्वर को संदेश भेजना है।सी

नमूना संदेश सी संरचना:

struct Registration 
{ 
char multicastGroup[24]; 
pid_t clientPid; 
}; 

क्लाइंट कोड स्निपेट को डी-क्रमानुसार डेटा

if(recvfrom(sd, recvBuf, recvBufSize, 0, (struct sockaddr*)&clientAddr, &len) < 0) 
{ 
     printf("Error receiving message from client\n"); 
} 
else 
{ 
     printf("Message received:%s\n", recvBuf); 
     printf("Size :%d\n", strlen(recvBuf)); 
     memcpy(&regn, recvBuf, sizeof(regn)); 
     printf("PID:%d\n", regn.clientPid); 
     printf("MG:%s\n", regn.multicastGroup); 
} 
को struct क्रमानुसार करने

struct Registration regn ; 
regn.clientPid = getpid(); 
strcpy(regn.multicastGroup, "226.1.1.1"); 

printf("PID:%d\n", regn.clientPid);   
printf("MG:%s\n", regn.multicastGroup); 
printf("Size:%d\n", sizeof(regn));   //Size is 28 

data = (unsigned char*)malloc(sizeof(regn)); 
memcpy(data, &regn, sizeof(regn)); 
printf("Size:%d\n", sizeof(data));   //Size is 4. 

सर्वर कोड

संरचना को unsigned char * पर कॉपी करने के बाद, सरणी का आकार केवल 4.
डेटा को सरणी में पूरी तरह से कॉपी क्यों नहीं किया जाता है?

सर्वर चार सरणी से संरचना का पुनर्निर्माण करने में सक्षम नहीं है।
कृपया मुझे बताएं कि मैं क्या गलत कर रहा हूं।

उत्तर

10

sizeof(regn) अपनी पूरी संरचना Registration, wheras sizeof(data) आपकी मशीन पर सूचक 4 बाइट है कि के आकार है के आकार देता है (dataRegistration प्रकार का सूचक होना चाहिए)।

एक्सप्रेशन में:

memcpy(data, &regn, sizeof(regn)); 
     ^ ^
     |  value variable of struct type 
     is pointer 

भी printf में देखते हैं, . जैसे तत्वों का उपयोग करने के लिए किया जाता है regn.multicastGroup

+0

मैं इस डेटा को सॉकेट पर भेजना चाहता हूं। इसलिए मैं इसे 'हस्ताक्षरित' * ' – cppcoder

+0

@cppcoder पर उपयोग करता हूं जो आपके द्वारा उपयोग किए जाने वाले कार्य का आकार लेता है, यदि आप संग्रहीत डेटा का आकार लेते हैं तो आप 'आकार (संरचना पंजीकरण)' –

+0

@cppcoder का उपयोग करना चाहते हैं, आप' sendto() का उपयोग करते हैं ' सी –

3

यदि आप एक ही एंडियन मशीन पर भेजते हैं और पुनः प्राप्त करते हैं तो कोड काम करेगा - क्लाइंटपिड का निरीक्षण करते समय आपके क्लाइंट और सर्वर को नेटवर्क एंडियन रूपांतरण के लिए मेजबान निष्पादित करना चाहिए।

+0

क्या आप दिखाते समय एक चर पर 'htonl' प्रदर्शन करने के लिए दिखा सकते हैं? – cppcoder

0

पोर्टेबिलिटी कारणों के लिए प्लेटफार्म-विशिष्ट अंतहीनता और संरचना पैडिंग के कारण व्यक्तिगत रूप से प्रत्येक संरचना सदस्य को क्रमबद्ध करने का एक अच्छा अभ्यास है।

binn *obj; 

    // create a new object 
    obj = binn_object(); 

    // add values to it 
    binn_object_set_int32(obj, "clientPid", getpid()); // assuming it is 32 bits 
    binn_object_set_str(obj, "multicastGroup", "226.1.1.1"); 

    // send over the network 
    send(sock, binn_ptr(obj), binn_size(obj)); 

    // release the buffer 
    binn_free(obj); 

यह सिर्फ 2 फ़ाइलें (binn.c और binn.h) है, इसलिए यह परियोजना के भीतर के बजाय संकलित किया जा सकता किसी साझा लाइब्रेरी के रूप में इस्तेमाल:

यहाँ एक उदाहरण Binn का उपयोग कर रहा है।

संदेश संदेश और खंडित संदेशों से बचने के लिए आपको सॉकेट स्ट्रीम में संदेश फ़्रेमिंग (जिसे लम्बाई-उपसर्ग फ़्रेमिंग भी कहा जाता है) का उपयोग करना चाहिए।