慕尼黑0001808 的学生作业:
#include
#include /* See NOTES */
#include
#include
#include
#include
#include
#include
#include
void sig_handler(int signum)
{
waitpid(-1, NULL, WNOHANG);
printf("recv singnum = %d zombie\n", signum);
return;
}
int main(int argc, char *argv[])
{
int ret;
int socket_id;
char server_ip[] = "192.168.0.191";
char server_port[] = "8080";
struct sockaddr_in server_addr;
struct sockaddr_in peer_addr;
ssize_t rbytes = 0;
char rbuffer[64];
// 0.主进程回收僵尸态子进程
if (signal(SIGCHLD, sig_handler) == SIG_ERR)
{
perror("Fail to single\n");
return -1;
}
socklen_t server_addrlen = sizeof(struct sockaddr_in);
socklen_t peer_addrlen = sizeof(struct sockaddr_in);
socket_id = socket(AF_INET,SOCK_DGRAM,0);
if(-1 == socket_id){
perror("socket()");
exit(EXIT_FAILURE);
}
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(server_ip);
server_addr.sin_port = htons(atoi(server_port));
ret = bind(socket_id,(struct sockaddr *)&server_addr,server_addrlen);
if(-1 == ret){
perror("bind()");
exit(EXIT_FAILURE);
}
while(1){
memset(rbuffer,0,sizeof(rbuffer));
memset(&peer_addr,0,sizeof(peer_addr));
rbytes = recvfrom(socket_id,rbuffer,64,0,(struct sockaddr *)&peer_addr,&peer_addrlen);
if(-1 == rbytes){
perror("recvfrom()");
exit(EXIT_FAILURE);
}
printf("server main :%s\n",rbuffer);
if(0 == fork()){
//close(socket_id);
close(socket_id); // 关闭主进程的socket(不再共享)
// 创建子进程独立的socket
socket_id = socket(AF_INET, SOCK_DGRAM, 0);
char response[128];
while(1){
memset(response,0,128);
snprintf(response,128,"子进程(pid=%d)已处理消息:%s",getpid(),rbuffer);
ret = sendto(socket_id,response,strlen(response),0,(struct sockaddr *)&peer_addr,peer_addrlen);
if(-1 == ret){
perror("child sendto()");
exit(EXIT_FAILURE);
}
rbytes = recvfrom(socket_id,rbuffer,64,0,(struct sockaddr *)&peer_addr,&peer_addrlen);
if(-1 == rbytes){
perror("子进程recvfrom()");
exit(EXIT_FAILURE);
}
rbuffer[rbytes] = '\0';
printf("子进程%d收到客户端数据:%s\n",getpid(),rbuffer);
if(strncmp(rbuffer,"quit",4)==0){
printf("子进程%d收到退出指令\n",getpid());
exit(EXIT_SUCCESS);
}
}
exit(EXIT_SUCCESS);
}
}
return 0;
}