У меня есть клиент в 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();
}
Спасибо за любую помощь.