سؤال

أنا أستخدم strcmp كما هو موضح أدناه.

أنا أخطب القيم والتي تأتي نفسها ولكن لا تزال لا تحصل على هذا الشرط صحيحا.

const char opcode_read[2] = {'0', '1'};

rc = recvfrom(s, blk_receive_full, sizeof (blk_receive_full), 0,(struct sockaddr FAR *)&sin, &fromlength);

if(rc == -1){
    printf("failed: recvfrom, \n No data received \n failed code: %d\n",WSAGetLastError());
    cleanup();
    exit(1);
}

memcpy(blk_receive_opcode, &blk_receive_full, 2);
if (strcmp(blk_receive_opcode, opcode_data) == 0) {
}
هل كانت مفيدة؟

المحلول

من ما يمكنني أن أقول إليه، لا تقارن بين سلسلتين لأنها ليست ذات شهرين. قد ترغب في استخدام memcmp() في حين أن:

if (memcmp(blk_receive_opcode, opcode_data, 2) == 0) {
}

نصائح أخرى

قد ترغب في المحاولة memcmp في حين أن. strcmp هو باختلار سلاسل تم إنهاءها.

opcode_read. ليس سلسلة. لا يوجد إنهاء NUL. قم بتغيير حجمها إلى 3، لذلك يمكنك التقاط NUL في المركز الثالث.

const char opcode_read[3] = {'0', '1'};

بديل سيكون للاستخدام memcmp. بدلاً من strcmp. لذلك لا داعي للقلق بشأن المنهي PSKY NUL.

ال recvfrom. مكالمة مخيفة بعض الشيء أيضا. إذا كنت أتذكر بلدي tcpip بشكل صحيح. لا يوجد أي ضمان أن الوظيفة ستعود 2 بايت في مكالمة واحدة. قد يعود بايت واحد، في الدعوة الأولى، والبايت الثاني في الدعوة الثانية.

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