TCP soket o'qish

Men savolni qanday tasvirlashni bilmayman, shuning uchun men misolni keltiraman.

Bill TCP skeletlari orqali ma'lumotlarni Elisga jo'natadi. Quyidagi kod:

write(socketfd,buff,10000);

Elis esa ma'lumot hajmining har doim 10000 ekanligini bilar edi. Quyidagi kod:

read(socketfd,buff,10000);

Savol shuki, Elis 10000 dan kichik bo'lmagan ma'lumotlarni oladi va u yana uyni o'qish kerak.

1

6 javoblar

Ha! TCP soketlari oqim interfeysini ta'minlaydi va ma'lumotlar bir nechta qismda yetkazilishi mumkin.

Qabul qiluvchining ma'lumoti qabul qilinmaguncha o'qishni davom ettirish kerak.

while (totalRead < expectedSize) {
    result = read(socketfd,buff + totalRead, expectedSize-totalRead);
    if (result < 0) {
       //nothing read, check for errors
    } else {
        totalRead += result;
        if (result == 0) {
            //Other end shutdown before sending the expected amount of data
        }
    }
}

Yozish uchun xuddi shunday:

while (written < totalSize) {
    result = write(socketfd,buff + written, totalSize - written);
    if (result < 0) {
       //nothing written, check for errors
    } else {
        written += result;
    }
}
2
qo'shib qo'ydi
totalSize o'qimasdan oldin oqim normal ravishda yopilgan bo'lsa, dastur doimiy ravishda aylanadi. o'qib chiqing bilan qaytariladigan 0 (faylning oxirida bo'ladi).
qo'shib qo'ydi muallif JeremyP, manba
@JeremyP rahmat. Tekshirish qo'shildi.
qo'shib qo'ydi muallif Klas Lindbäck, manba

Savol: Elis 10000 dan kichik bo'lmagan ma'lumotni qo'lga kiritishi mumkin va u yana rozetkani o'qish kerak.

Ha.

1
qo'shib qo'ydi

O'qishlar, odatda, ba'zi ma'lumotlarni o'qib bo'lgandan so'ng qaytadi. O'qilgan baytlarning haqiqiy sonini va xato uchun salbiy sonni qaytaradi.

Boshqa tomondan, TCP ma'lumotlar bir vaqtning o'zida kelishini kafolatlamaydi. Shunday qilib, kerakli ma'lumotlar uzunligini o'qishni tugatmaguningizcha, qaytarib olish kodini qayta-qayta tekshirishingiz kerak.

1
qo'shib qo'ydi

Xato bo'lsa nima bo'ladi? Yopiq aloqani tekshirish uchun nima qilish kerak? Har ikkisi ham qaytarilgan qiymati yordamida read tomonidan bildirilgan.

Shuni ham yodda tutingki, TCP birinchi navbatda qattiq paket o'lchamlari mavjud bo'lmagan holda oqimli protokoli hisoblanadi, shuning uchun bitta qo'ng'iroq barcha hali o'qilmagan bo'lsa, barcha ma'lumotlarni o'qimasligi mumkin. Va ikkinchidan, asosiy protokollar uning uzatilishi uchun katta paketlarga ega bo'lmasligini va ma'lumotlarni bir vaqtning o'zida oladigan kichikroq qismlarga bo'lishini unutmang.

Shunday qilib, har doim read qo'ng'iroqlari o'qilgan haqiqiy hajmini tekshiring.

1
qo'shib qo'ydi

Ha, TCP paketga yo'naltirilgan emas va tarmoq to'plami kiruvchi ma'lumotni biron-bir "katak o'lchov" da etkazib berishga qaror qilishi mumkin.

Ehtimol, dastlabki 10% ga ega bo'lasiz, keyin tarmoq uzilishining bir necha soniyasi bor, bundan keyin TCP hozirgacha olingan ma'lumotlarni taqdim etishi mumkin.

To'liq paketga yo'naltirilgan bo'lmagan har qanday I/U bilan siz kutilgan miqdordan to hozirgacha o'qib chiqing. Bu to'g'ri mahalliy fayllardan ham o'qish uchun to'g'ri.

1
qo'shib qo'ydi

Ha va bir xil yozish uchun. yozishning nominal qiymatini tekshirishingiz kerak.

1
qo'shib qo'ydi