Я установил простую клиентскую и серверную программу, используя TCP-сокет для связи. Сервер ожидает, что клиент подключится и ответит, получает ли он сообщение от клиента. Ниже, как код реализован на сервере и клиенте:Как узнать, что send() или sendmsg() успешно доставляют сообщение?
кода на стороне сервера:
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0)
error("ERROR writing to socket");
кода на стороне клиента:
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
else
printf("sucess. n = %d", n);
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
Теперь предположим, что Я запускаю сервер, а затем запускает клиент, клиент успешно подключается к серверу. Затем я закрываю сервер и пытается отправить сообщение от клиента, операция write()
не возвращает ошибку. То, что я ожидаю здесь, является ошибкой, потому что сервер фактически не получает никаких пакетов (он отключается).
Так что мой вопрос: есть ли способ узнать, успешно поставляет ли write()
(или send()
, sendto()
или sendmsg()
) сообщение на сервер?
Многие люди спрашивают: «Если стек TCP знает, что этот пакет был подтвержден (ACK'd) удаленным хостом, почему мой код приложения не может определить это?» Причина в том, что TCP знает только, был ли пакет ACK'd уровнем TCP удаленного узла. Он не знает, действительно ли подтвержденные данные были фактически использованы приложением, размещающим сокет на удаленной стороне. Следовательно, прототипы более высокого уровня выше TCP (т. Е. Ваш код и протокол) должны обеспечивать эту сигнализацию. – selbie