2014-05-12 146 views
0

我遇到问题,当我尝试关闭客户端连接时,我想关闭与服务器的连接,当客户端写入一个字符串“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); 
+0

那么,假设缓冲器是可以安全地印有一个printf的空终止字符串(“%S ..)邀请灾害,然后您尝试将“q”与刚刚读取的缓冲区部分之后的未定义字符进行比较:'&buffer [n]'。检查所有的服务器和客户端代码是否有无效的假设 - 接收到的数据保证为空终止,并且TCP传输的消息超过一个字节 - 它不会,它只传输八位字节/字节流,并且通常需要多个读取调用来传输应用程序级协议单元。 –

+0

网络编程有几个陷阱,你必须知道在开始之前。我建议在进一步研究之前阅读其中一本关于网络编程的书。否则,你会不断遇到看起来不直观的事情。 – Johannes

回答

2
read(newsocketfd, buffer, sizeof(buffer))) 

缓冲区溢出代码的代码-------- ---------------^

if ((n = read(newsocketfd, buffer, sizeof(buffer) - 1)) > 0) { /* Note -1 */ 
    buffer[n] = '\0'; /* read() doesn't add a trailing 0 */ 
    printf("(Mlength %d) message from Client: %s\n",n,buffer); 
} else { 
    ... 

if (strcmp("q", &buffer[n]) == 0) /* you are reading NUL ('\0') */ 

变化:

if (strcmp("q", buffer) == 0) 
+0

缓冲区似乎永远不会只有字符q,它总是有n + 1个字符,并且是因为验证不起作用,请您给我和建议以关闭两个程序之间的连接? – ronsuez

+0

您是否尝试过使用'sizeof(buffer) - 1'或'strlen(buffer)'? (同样的'write()') –

+0

检查strlen工作正常并且连接已关闭,但是我想指定一个字符串(“quit”)来关闭连接 – ronsuez

相关问题