【发布时间】:2021-05-14 09:41:23
【问题描述】:
我在使用 TCP/IP 套接字实现登录/注册系统时遇到了麻烦。
所以,每当我想让用户注册时,客户端不能插入用户名,但他可以插入密码。好像跳过了一步。
这里是代码。
客户
void func(int sockfd)
{
char username[MAX], password[MAX];
int n, c;
bzero(username, sizeof(username));
printf("Enter the username : ");
n = 0;
while ((username[n++] = getchar()) != '\n')
;
write(sockfd, username, sizeof(username));
bzero(username, sizeof(username));
bzero(password, sizeof(password));
printf("Enter the password : ");
c = 0;
while ((password[c++] = getchar()) != '\n')
;
write(sockfd, password, sizeof(password));
bzero(username, sizeof(password));
}
...
int choice, ans;
func(sockfd);
bzero(buffer, 255);
n = read(sockfd, buffer, 255);
if(n < 0)
error("Error reading from socket");
printf("Server - %s", buffer);
scanf("%d", &choice);
write(sockfd, &choice, sizeof(int));
if(choice == 1) {
func(sockfd);
}
if(choice == 3) {
printf("Session terminated\n");
close(sockfd);
}
close(sockfd);
return 0;
服务器
void func(int newsockfd)
{
char username[MAX], password[MAX];
int n;
bzero(username, MAX);
read(newsockfd, username, sizeof(username));
printf("From client: %s\n", username);
bzero(password, MAX);
read(newsockfd, password, sizeof(password));
printf("From client pass: %s\n", password);
while ((username[n++] = getchar()) != '\n')
;
write(newsockfd, username, sizeof(username));
}
int main(int argc, char *argv[]) {
func(newsockfd);
int num1, num2, ans, choice;
n = write(newsockfd, "Benvenuto, inserisci una scelta: \n1. Registrazione\n2. Login\n3. Esci\n", strlen("Benvenuto, inserisci una scelta: \n1. Registrazione\n2. Login\n3. Esci\n"));
if(n < 0) error("Error writing to socket");
read(newsockfd, &choice, sizeof(int));
switch(choice) {
case 1:
func(newsockfd);
break;
case 2:
break;
case 3:
close(newsockfd);
close(sockfd);
}
close(newsockfd);
close(sockfd);
return 0;
}
这是一个例子:
【问题讨论】:
-
您忽略了
read()返回的值。你不能那样写正确的网络程序。它可以是 -1,也可以是 0,或者它可以是 1 和您提供的长度之间的任何值,两者都包括在内。更正您的代码并重新测试。 -
感谢您的回答。我按照您的建议修复了代码,但程序仍然损坏。函数 func(....) 在切换之前工作正常.. 但是每当我在案例 1 中插入 func(.....) 时,客户端就无法插入用户名。
标签: sockets tcp tcpclient serversocket