while循环在从远程服务器接收数据时挂起read().C插座



我对套接字编程非常陌生,正在尝试编写一个简单的程序,该程序在远程机器中执行命令并返回输出。使用popen((执行命令,分配值并将其发送到远程计算机。read((正在接收数据,但在打印时,我们会看到数据的重复。read((没有命中EoR,所以while循环挂起。流似乎没有结束。这些是TCP套接字。这里需要帮助。

客户端代码
//Opening socket 
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such hostn");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
...
...

bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");

sprintf(command , buffer) ;
pf = popen(command,"r");

bzero(data,513);

while (fgets(data, 512, pf) != NULL) {

write(newsockfd, data, strlen(data));
printf("%s", data);

}
服务器代码
....
...
// Opening socket
sockfd =  socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) 
error("ERROR opening socket");
....
...
bzero(buffer,513);
while ((n= read(sockfd, buffer, 512)) > 0 ) {
printf("%sn", buffer);
}
close(sockfd);
return 0;

while循环的原因是远程机器的输出格式与在命令上执行的格式相同。我相信还有更好的方法可以达到同样的效果。我就是找不到。

不幸的是,这段代码有太多问题,唯一的解决方案是在没有所有基本误解的情况下重写它

n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");

不能保证这会读取整个命令。

sprintf(command , buffer) ;

如果接收到的数据包括"%s";?此sprintf将崩溃。你在等"%"吗"要转义的字符?

bzero(buffer,513);
while ((n= read(sockfd, buffer, 512)) > 0 ) {
printf("%sn", buffer);
}

第一次通过时,这将起作用,因为bzero会在字符串的末尾加一个零。但第二次通过,它不会起作用。您有n,即读取的字节数。你为什么不使用它?

核心问题是您需要发送一条消息,一条命令。但您没有发送或接收消息的代码。TCP提供字节的流,而不是消息。您需要决定并实现发送和接收消息的消息协议。

每个用C这样的语言编写代码来处理TCP的人一开始都会犯这些错误。这是每个人都要经历的阶段。

一条重要的建议——在你更有经验之前,正式指定你实现的每一个协议。看看HTTP或SMTP之类的协议规范,了解它们的样子。充分地记录它,以便有人可以根据该规范编写一个与您的客户端一起工作的服务器(反之亦然(。

是的,这很乏味。但当出现错误时,你可以按照这个简单的三部分测试:

  1. 服务器是否遵循规范?如果没有,请停止,说明服务器已损坏。

  2. 客户是否遵守规范?如果没有,请停止,说明客户端已损坏。

  3. 规格已损坏。修复它。

如果没有规范,当服务器或客户端不能正确合作时,就无法判断它们是坏的。这使得调试更加混乱,因为没有";一条正确的路";任何一个都应该起作用。

最新更新