【发布时间】:2014-05-12 16:36:40
【问题描述】:
当我尝试关闭来自客户端的连接时遇到问题,我想在客户端写入“q”之类的字符串时关闭与服务器的连接,并且我在来自客户端的消息之后执行 strcmp由服务器读取,但由于未通过比较而无法正常工作。
这是服务器的代码
while(1){
if((n = read(newsocketfd,buffer,sizeof(buffer))) > 0)
printf("(Mlength %d) message from Client: %s\n",n,buffer);
else{
close(socketfd);
close(newsocketfd);
error("Error reading message \n");
}
if(strcmp("q",&buffer[n]) == 0)
printf("El cliente intenta cerrar la conexión %s\n",&buffer[n]);
else
printf("Se recibieron datos desde el cliente %s\n",&buffer[n]);
if(write(newsocketfd,response,255) > 0)
printf("Writing response to Client socket \n");
else
error("Error writing message \n");
}
return EXIT_SUCCESS;
}
这是客户端的代码
do{
printf("Please, type your message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(socketfd,buffer,sizeof(buffer));
if(n < 0 )
error("Error writing to socket \n");
else
printf("...Message sent \n");
n = read(socketfd,buffer,sizeof(buffer));
if(n < 0 )
error("Error writing to socket \n");
else
printf("\n Message from server: %s \n",buffer);
}while(strcmp("q",buffer)!=0);
【问题讨论】:
-
好吧,假设缓冲区是一个可以用 printf("%s..) 安全打印的以 null 结尾的字符串,这会招致灾难,然后您尝试将 "q" 与未定义的字符串进行比较在已读取的缓冲区部分之后的字符:'&buffer[n]'。检查所有服务器和客户端代码是否存在无效假设 - 接收到的数据保证为空终止,并且 TCP 传输的消息长度超过一个字节 - 它不,它只传输八位字节/字节流,并且通常需要多次读取调用才能传输应用程序级协议单元。
-
网络编程有几个陷阱,你必须在开始之前了解这些陷阱。我建议在进一步学习之前阅读一本关于网络编程的书籍。否则你会经常遇到一些看起来不直观的事情。