别摸我的键盘 的学生作业:
服务器代码
#include
#include
#include
#include /* See NOTES */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MSG_SZ 128
#define LOGIN_FAIL_STATE 0
#define LOGIN_SUCCESS_STATE 1
void printf_data_info(struct sockaddr_in * addr_in, char *buf){
printf("=======================================================\n");
printf("host is %s\n", inet_ntoa(addr_in -> sin_addr));
printf("port is %d\n", ntohs(addr_in -> sin_port));
printf("buf content is %s\n", buf);
printf("=======================================================\n");
}
int socket_init(const char *ip, const char *port){
int socket_fd;
struct sockaddr_in addr_in;
int ret;
socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(socket_fd == -1){
perror("[ERROR] socket()");
exit(EXIT_FAILURE);
}
memset(&addr_in, 0, sizeof(addr_in));
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(atoi(port));
addr_in.sin_addr.s_addr = inet_addr(ip);
ret = bind(socket_fd, (const struct sockaddr*)&addr_in, sizeof(addr_in));
if(ret == -1){
perror("[ERROR] bind()");
exit(EXIT_FAILURE);
}
return socket_fd;
}
void recv_data(int sc_fd){
struct sockaddr_in addr_in;
char buf[MSG_SZ] = {0};
int len = sizeof(addr_in);
while(1){
memset(buf, 0, sizeof(buf));
recvfrom(sc_fd, buf, sizeof(buf), 0, (struct sockaddr *)&addr_in, &len);
printf_data_info(&addr_in, buf);
if(strncmp(buf, "quit",4) == 0){
break;
}
}
close(sc_fd);
exit(EXIT_SUCCESS);
}
int user_login(const char *ip, const char *port){
struct sockaddr_in addr_in;
char buf[MSG_SZ]={0};
int len = sizeof(addr_in);
ssize_t sz;
int login_state = LOGIN_FAIL_STATE;
int socket_new_fd, socket_fd;
socket_fd = socket_init(ip, port);
while(1){
memset(buf, 0, MSG_SZ);
sz = recvfrom(socket_fd, buf, sizeof(buf), 0, (struct sockaddr *) &addr_in, &len);
if(-1 == sz){
perror("[ERROR] recvfrom()");
exit(EXIT_FAILURE);
}
printf("password is %s\n", buf);
login_state = (strncmp(buf, "root", 4) == 0 ? LOGIN_SUCCESS_STATE : LOGIN_FAIL_STATE);
if(login_state == LOGIN_SUCCESS_STATE){
if(fork() == 0){
printf("login successful!\n");
//login successful
close(socket_fd);
//指定端口为0 操作系统会随机分配可用端口
socket_new_fd = socket_init(ip, "0");
sendto(socket_new_fd, &login_state, sizeof(login_state),0,(struct sockaddr *) &addr_in, len);
break;
}
}else{
sendto(socket_fd, &login_state, sizeof(login_state),0,(struct sockaddr *) &addr_in, len);
}
}
return socket_new_fd;
}
void deal_signal(int signum){
waitpid(-1,NULL,WNOHANG);
printf("recv singnum = %d zombie\n",signum);
return ;
}
int main(int argc, const char *argv[])
{
if(argc != 3){
fprintf(stderr, "[ERROR] %s \n", argv[0]);
exit(EXIT_FAILURE);
}
if(signal(SIGCHLD, deal_signal) == SIG_ERR){
perror("[ERROR] signal");
exit(EXIT_FAILURE);
}
int socket_fd;
int socket_new_fd;
socket_new_fd = user_login(argv[1],argv[2]);
recv_data(socket_new_fd);
return 0;
}