recv()函数没有读取输入(套接字编程)

时间:2015-03-21 19:51:33

标签: c string sockets

这是一个模拟凭证验证服务器的简单程序。客户端应使用telnet连接到端口80上的服务器。客户端应输入用户名和匹配的密码。问题是recv()函数似乎没有得到正确的输入(因此可以对其进行进一步处理)。

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

int main()
{

    char * credentialsList[7][2] = {{"Alice","abcdef"}, {"Bob","1234567"}, {"Cindy","qwerty"}, {"David","abababab"}, {"Eve", "cdefgh"}, {"Frank","7654321"}, {"George", "12341234"}};
    int serverSocket=socket(AF_INET, SOCK_STREAM, 0);
    int new_socket, i;
    char *message, client_message[10];
    struct sockaddr_in server, client;
    server.sin_family =  AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(80);
    bind(serverSocket, (struct sockaddr *)&server, sizeof(server));
    listen(serverSocket,2);
    int c = sizeof(struct sockaddr_in);
    new_socket = accept(serverSocket, (struct sockaddr *)&client, (socklen_t*)&c);
    message = "Welcome! You Are Now Connected To The Server.\n\n";
    write(new_socket, message, strlen(message));
    message = "Please Enter A Valid Username: ";
    write(new_socket, message, strlen(message));
    memset(client_message,0,sizeof(client_message));
    recv(new_socket, client_message, 10, 0);
    //int x = strcmp(client_message,credentialsList[0][0]);
    //printf("%i", x);

    puts(client_message);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

如何检测用户名的结尾?它是通过连接结束,换行符还是'\0'字符检测到的?由于您没有提供客户端代码,因此无法回答这个问题。

无论如何,你没有检查recv()的返回值,并且注释掉的内容假定它是一个'\0' - 终止的字符串,可能不是真的。您应该始终检查系统调用的返回代码,并且永远不要假设客户端数据要按照特定格式进行格式化。

您需要做的是阅读凭据而不是其他内容。这甚至可能需要一次读取1个字节,直到你换行换行符(如果它的换行符更新(更有效的实现是在recv()之上实现缓冲层)。请注意,读取凭据可能需要多次recv()次调用,因为凭据可能会以1字节大小的TCP段到达。