Я пытаюсь читать и писать в сокет, используя сетевое программирование linux в C. Я делаю успешные вызовы «писать» и «читать» в клиентских и серверных программах соответственно.Ошибка сокета в C с использованием функций чтения и записи
Часть, с которой я с трудом понимаю, заключается в том, что на моей клиентской программе я петлю и вызываю запись 5 раз, на сервере, я петлю и вызываю чтение 5 раз.
Это ожидаемый результат:
MSG: I got your message MSG: I got your message MSG: I got your message MSG: I got your message MSG: I got your message
Это фактический выход:
MSG: I got your messageI got your messageMSG: I got your messageI got your messageMSG: I got your messageMSG: MSG:
Как вы можете видеть ожидаемый результат и фактический выход различны. Похоже, клиент может позвонить «написать» дважды, прежде чем он будет отправлен.
Это то, что у меня есть для кода клиента
for(int i=0;i<5;i++)
{
int n = write(ssocket.socketFileDescriptor,"I got your message",18);
cout<<n<<" number of bytes written."<<endl;
if (n < 0) socketError("ERROR writing to socket");
}
Это код сервера:
void* run(void* arg)
{
ServerSocket* ss = (ServerSocket*)arg;
//while(true)
for(int i=0;i<5;i++)
{
char buffer[256];
bzero(buffer,256);
int n = read(ss->newsockfd,buffer,256);
printf("MSG: %s",buffer);
}
close(ss->newsockfd);
}
Это дополнение к вопросу, ниже которого находится вне даты в данный момент.
Мне не хватает звонка на флеш или что-то еще?
Simulate Java's Thread class in C++
Вы считаете, что TCP может передавать сообщения размером более одного байта. Он не может - это протокол байта/октета STREAMING и не знает границ сообщений выше одного байта. Если вы хотите передавать более крупные и более сложные сообщения, вам нужен протокол поверх TCP. Есть бесконечные оверки этого вопроса - так много, что меня не беспокоит, чтобы выглядеть :) –
Если вы используете сокеты TCP, то все отправленное объединяется в один поток, и когда он читается, вы получаете то, что доступно в этот момент (до размера буфера). Вам необходимо вставить свои собственные границы сообщений и проанализировать поток в ресивере. – molbdnilo
Итак, я открыл wirehark и подтвердил, что каждый вызов «write» фактически создал собственный пакет. Это означает, что чтение является тем, где оно удваивается. Вот где я увидел «чтение», и я сказал в своем коде, чтобы прочитать 256 байтов. – Matthew