TCP соединение.Как заставить клиента отправлять данные только в момент чтения с сервера ()? - PullRequest
1 голос
/ 20 июня 2011

У меня есть клиент в iPod iOS 4.3 и сервер в Linux C. Я могу установить TCP-соединение и передавать данные.

Сервер работает в цикле с read () и printf. Клиент должен отправлять данные только по запросу. Я обнаружил, что даже после одного read (), printf и остановки в getchar () клиент (iPod) все еще получает сообщение m NSStreamEventHasSpaceAvailable и отправляет данные.

После того, как я нажимаю любую клавишу на сервере, он снова попадает в read () и показывает гораздо больше данных. Я просто хотел получить некоторую помощь по поводу синхронных / асинхронных и блокирующих / неблокирующих настроек, которые я должен использовать как на клиенте, так и на сервере. (теоретически, поэтому нет необходимости в кодировании, я думаю.)

По запросу, вот код сервера:

void testApp::setup() {

int portno;
struct sockaddr_in serv_addr;
socklen_t clilen;

connection = 0; //Still no connection

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) error("ERROR opening socket");

bzero((char *) &serv_addr, sizeof(serv_addr));


portno = atoi("50000");
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
      error("ERROR on binding");

listen(sockfd,5);

}

void testApp::update() {

int check = 0;
int n;
char buffer[256];

if(connection != 0)
{
check = recv(newsockfd, buffer, 256, MSG_PEEK|MSG_DONTWAIT);
}
/*
developerweb.net/viewtopic.php?id=5627
*/
if(connection == 0 /*1st connection*/ | check == 0 | (check < 0 && errno != EAGAIN))
{ printf("CHECK é %d",check);
    if(connection != 0)
    {   close(newsockfd); newsockfd = -1; printf("Client disconnected.\n");}
    printf("\n\n-=Waiting for connection...=-\n");
    newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);
    printf("\nClient connected successfuly! \n");

}
if (newsockfd < 0) {printf("ERROR on accept"); close(newsockfd); newsockfd=-1; }
else if(newsockfd == 0) printf("No socket\n");
else
{
    printf("Waiting for message...\n");
    connection = 1;
    bzero(buffer,256);
    n = read(newsockfd,buffer,255);
    if (n < 0) error("ERROR reading from socket");
    printf("Here is the message: %s\n",buffer);
}

printf("\nPress any key to continue...");
getchar();
}

Спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Не беспокойтесь о координации между клиентом и сервером - это потребует отправки данных туда и обратно, что, вероятно, потребует большей координации ... Это становится круговой проблемой. Просто сделайте так, чтобы клиент отправил свои данные, и сервер прочитал, пока больше нет данных. Сетевое программное обеспечение более низкого уровня поставит в очередь любые данные, которые находятся между чтениями, так что вы ничего не пропустите.

0 голосов
/ 20 июня 2011

Клиент не может знать, готов ли сервер к чтению, пока сервер не сообщит об этом клиенту.

Вместо того, чтобы выдавать сообщения от клиента, дождитесь запроса от сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...