这是一个模拟凭证验证服务器的简单程序。客户端应使用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;
}
答案 0 :(得分:2)
如何检测用户名的结尾?它是通过连接结束,换行符还是'\0'
字符检测到的?由于您没有提供客户端代码,因此无法回答这个问题。
无论如何,你没有检查recv()
的返回值,并且注释掉的内容假定它是一个'\0'
- 终止的字符串,可能不是真的。您应该始终检查系统调用的返回代码,并且永远不要假设客户端数据要按照特定格式进行格式化。
您需要做的是阅读凭据而不是其他内容。这甚至可能需要一次读取1个字节,直到你换行换行符(如果它的换行符更新(更有效的实现是在recv()
之上实现缓冲层)。请注意,读取凭据可能需要多次recv()
次调用,因为凭据可能会以1字节大小的TCP段到达。