慕工程6300203 的学生作业:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LOGIN_SUCCESS 1
#define LOGIN_FAILURE 0
void recv_data(int fd)
{
char buffer[1024] = {0};
struct sockaddr_in client_addr;
int len = sizeof(client_addr);
int ret;
while(1)
{
memset(buffer, 0, sizeof(buffer));
ret = recvfrom(fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &len);
if (ret < 0)
{
perror("[ERROR] recvfrom");
exit(EXIT_FAILURE);
}
printf("============================\n");
printf("Recvfrom IP: %s\n", inet_ntoa(client_addr.sin_addr));
printf("Recvfrom PORT: %d\n", ntohs(client_addr.sin_port));
printf("Received data: %s\n", buffer);
if (strncmp(buffer, "quit", 4) == 0)
break;
}
close(fd);
exit(EXIT_SUCCESS);
}
int init_socket(char *ip, char *port)
{
int socket_fd;
struct sockaddr_in connect_addr;
int ret;
socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(socket_fd == -1)
{
perror("[ERROR] Socket Create Failed");
exit(EXIT_FAILURE);
}
memset(&connect_addr, 0, sizeof(connect_addr));
connect_addr.sin_family = AF_INET;
connect_addr.sin_port = htons(atoi(port));
connect_addr.sin_addr.s_addr = inet_addr(ip);
ret = bind(socket_fd, (struct sockaddr *)&connect_addr, sizeof(connect_addr));
if (ret < 0)
{
perror("[ERROR] Bind Failed");
exit(EXIT_FAILURE);
}
return socket_fd;
}
int user_login(char *ip, char *port)
{
int socket_fd, new_socket_fd;
struct sockaddr_in client_addr;
int len = sizeof(client_addr);
int ret;
pid_t cpid;
char buffer[20] = {0};
int login_flag = LOGIN_FAILURE;
socket_fd = init_socket(ip, port);
while(1)
{
memset(buffer, 0, sizeof(buffer));
ret = recvfrom(socket_fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &len);
if (ret < 0)
{
perror("[ERROR] Recv Failed");
exit(EXIT_FAILURE);
}
login_flag = strncmp(buffer, "password", 8) == 0 ? LOGIN_SUCCESS : LOGIN_FAILURE;
if (login_flag == LOGIN_SUCCESS)
{
cpid = fork();
if(cpid == 0)
{
close(socket_fd);
new_socket_fd = init_socket(ip,"0");
sendto(new_socket_fd, &login_flag, sizeof(login_flag), 0, (struct sockaddr *)&client_addr, len);
break;
}
} else
{
sendto(socket_fd, &login_flag, sizeof(login_flag), 0, (struct sockaddr *)&client_addr, len);
}
}
return new_socket_fd;
}
void sig_handle(int signum)
{
waitpid(-1, NULL, WNOHANG);
printf("recv singnum = %d zombie\n", signum);
}
int main(int argc, char* argv[])
{
if(argc != 3)
{
printf("Usage : %s \n", argv[0]);
exit(EXIT_FAILURE);
}
if (signal(SIGCHLD, sig_handle) == SIG_ERR)
{
perror("[ERROR] Signal Handle Error");
return -1;
}
int socket_fd = user_login(argv[1], argv[2]);
recv_data(socket_fd);
return 0;
}