2014-11-21 89 views
0

我正在将一些数据从客户端发送到“服务器”。这只是一个tcp连接,所以一旦连接,流将打开,直到我关闭它。无论如何,我发送一个用户名到服务器。服务器测试这是否是有效的用户名,然后发回消息成功或失败。如果它不是有效的用户名,则服务器重新连接,并且客户端再次请求用户名以再次测试,直到您成功登录。我遇到的问题是如果我输入了一个错误的用户名,它会正确地发送回应,并要求我重新发送一个新的。但是,当我现在输入正确的用户名时,它会失败。然后无论下一次发送什么,它都会成功,因为我之前发送过它,但它像等待,直到我再次进入。有没有人有任何想法如何解决这个问题?我对C.I很新,在每个循环之后尝试重置所有变量,但它仍然不起作用。 (是的,我知道UDP是完成这个任务的方式更好的选择..........其规范的一部分)这里是服务器循环TCP接收问题

int loggedIn = 0; 
    char username[MAX]; 
    char status[10]; 
    int statusLen=0; 
    int counter = 1; 
    while(!loggedIn){ 
     // receive username 
     counter = recv(clientSock, username, MAX - 1, 0); 
     username[counter] = '\0'; 
     printf("%s\n", username); 

     // check if username is in list 
     //if in the list, send success 
     if(strcmp(username,"test1234") == 0){ 
      strcpy(status,"success"); 
      statusLen = sizeof(status); 
      send(clientSock, status, statusLen,0); 
      loggedIn = 1; 
     }else { //if not in the list, send error and recv again 
      strcpy(status,"fail"); 
      statusLen = sizeof(status); 
      send(clientSock, status, statusLen,0); 
      memset(status,0,statusLen); 
     } 
    } 
    printf("YOU MADE IT FINALLY BUDDY\n"); 
    //send accounts 

这里是客户端环

char username[20]; 
     //verify login 
     int loggedIn = 0; 
     int counter = 0; 
     char status[10]; 
     while(!loggedIn){ 
      printf("Please login with your username: \n"); 
      scanf(" %s",username); 
      //send username to the server 
      int usernameLen = strlen(username); 
      send(serverSock, username, usernameLen,0); 
      //recieve from the server 
      counter = recv(serverSock, status, 9, 0); 
      status[counter] = '\0'; 
      //if success 
      if(strcmp(status, "success") ==0){ 
       loggedIn = 1; 
      } else {//else reenter the username 
       printf("Error: Invalid Username!\n"); 
       memset(username,0,sizeof(username)); 
       memset(status,0,sizeof(status)); 
       counter = 0; 
      } 
     } 

回答

1

发送的字符串大小可以是字符数,而不是字符串大小。
在代码:

statusLen = sizeof(status); 

你可以做

statusLen = strlen(status); 

strlen计数的字符,该字符串的不是规模。字符串内存大小和字符数在C中不一定相同。
您可以使用gets而不是scanf来读取字符串。
scanf每次找到空格都会打断字符串。
MAX是多少?看看缓冲区是否足以适应接收到的数据。
另请参阅您是否通过使用printf接收正确的数据。我不确定,但看起来你也在开发服务器。
希望这会有所帮助。我在代码中找不到任何其他错误。

+0

感谢您的意见!我会给这些尝试,让你知道 – user3704079 2014-11-21 21:09:24

+0

你是对的!非常感谢。 strlen是问题。由于scanf,我也在寻找stdin,但是这个工作很完美..再次感谢你 – user3704079 2014-11-21 21:14:20

+0

不客气。我很高兴它的作品!并感谢文本格式。我是新来的stackoverflow和混淆文本格式在这里。 – 2014-11-26 13:55:50