gpt4 book ai didi

c - TCP 连接。如何让客户端只在服务端read()的那一刻发送数据?

转载 作者:太空宇宙 更新时间:2023-11-04 02:16:52 25 4
gpt4 key购买 nike

我在 iPod iOS 4.3 中有一个客户端,在 Linux C 中有一个服务器。我可以建立 TCP 连接并传输数据。

服务器以 read() 和 printf 循环运行。客户端应该只在请求时发送数据。我发现,即使在一个 read()、printf 并在 getchar() 处停止之后,客户端 (iPod) 仍会收到消息 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();
}

感谢您的帮助。

最佳答案

不要担心客户端和服务器之间的协调——这需要来回发送数据,这可能需要更多的协调……这变成了一个循环问题。只需让客户端发送它的数据并让服务器读取,直到没有更多数据为止。较低级别的网络软件会将读取之间的所有数据排队,因此您不会错过任何内容。

关于c - TCP 连接。如何让客户端只在服务端read()的那一刻发送数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6411081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com