को समझना मैं कुछ यूड पैकेट को स्थानीयहोस्ट भेजने के परीक्षण के लिए यूनिक्स सॉकेट का उपयोग करने की कोशिश कर रहा हूं।htonl() और ntohl()
यह मेरी समझ है कि पैकेट भेजने के लिए आईपी पता और बंदरगाह सेट करते समय, मैं अपने sockaddr_in
को नेटवर्क-बाइट ऑर्डर में परिवर्तित मानों के साथ भर दूंगा। मैं पर OSX हूँ और मैं चकित है कि इस
printf("ntohl: %d\n", ntohl(4711));
printf("htonl: %d\n", htonl(4711));
printf("plain: %d\n", 4711);
प्रिंटों
ntohl: 1729232896
htonl: 1729232896
plain: 4711
तो न समारोह वास्तव में सादे मान देता हूँ। मुझे उम्मीद है कि परिणाम अलग-अलग होंगे, क्योंकि x86 छोटा-अंत (afaik) है, या समान और वास्तविक संख्या 4711 जैसा ही है। स्पष्ट रूप से मुझे समझ में नहीं आता कि htonl
और ntohl
और उनके रूप क्या हैं। मैं क्या खो रहा हूँ?
int main(int argc, char *argv[])
{
if (argc != 4)
{
fprintf(stderr, "%s\n", HELP);
exit(-1);
}
in_addr_t rec_addr = inet_addr(argv[1]); // first arg is '127.0.0.1'
in_port_t rec_port = atoi(argv[2]); // second arg is port number
printf("Address is %s\nPort is %d\n", argv[1], rec_port);
char* inpath = argv[3];
char* file_buf;
unsigned long file_size = readFile(inpath, &file_buf); // I am trying to send a file
if (file_size > 0)
{
struct sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = rec_addr; // here I would use htons
dest.sin_port = rec_port;
printf("ntohs: %d\n", ntohl(4711));
printf("htons: %d\n", htonl(4711));
printf("plain: %d\n", 4711);
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_fd != -1)
{
int error;
error = sendto(socket_fd, file_buf, file_size + 1, 0, (struct sockaddr*)&dest, sizeof(dest));
if (error == -1)
fprintf(stderr, "%s\n", strerror(errno));
else printf("Sent %d bytes.\n", error);
}
}
free(file_buf);
return 0;
}
ध्यान दें कि आपका टेक्स्ट "htons" और "ntohs" कहता है, लेकिन आप वास्तव में 'htonl() 'और' ntohl() 'को कॉल कर रहे हैं। –
@ जॉन बोलिंगर हां, जो एक ही परिणाम के साथ दोनों की कोशिश करने से आया, टिप्पणी के लिए धन्यवाद। – oarfish