#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <signal.h>
void handler(int arg) {
printf("recv singal %dn", arg);
exit(EXIT_SUCCESS);
}
#define ERR_EXIT(m)
do{
perror(m);
exit(EXIT_FAILURE);
} while(0)
int main() {
int listenfd;
if ((listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
ERR_EXIT("socket");
}
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(5188);
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
int on = 1;
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) {
ERR_EXIT("setsockopt");
}
if (bind(listenfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) {
ERR_EXIT("bind");
}
if (listen(listenfd, SOMAXCONN) < 0) {
ERR_EXIT("listen");
}
struct sockaddr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
int conn;
if ((conn = accept(listenfd, (struct sockaddr *)&peeraddr, &peerlen)) < 0) {
ERR_EXIT("accept");
}
printf("ip=%s, port=%dn", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));
pid_t pid;
if ((pid = fork()) < 0) {
ERR_EXIT("fork");
} else if(pid == 0) {
signal(SIGUSR1, handler);
char sendbuf[1024] = {0};
while (fgets(sendbuf, sizeof(sendbuf), stdin) != 0) {
if (write(conn, sendbuf, sizeof(sendbuf)) < 0) {
ERR_EXIT("write");
}
memset(sendbuf, 0, sizeof(sendbuf));
}
printf("child closen");
close(conn);
} else {
char recvbuf[1024] = {0};
while (1) {
int ret;
if ((ret = read(conn, recvbuf, sizeof(recvbuf))) < 0) {
ERR_EXIT("read");
} else if (ret == 0) {
printf("client closen");
break;
}
fputs(recvbuf, stdout);
memset(recvbuf, 0, sizeof(recvbuf));
}
printf("parent closen");
kill(pid, SIGUSR1);
sleep(1);
close(conn);
}
close(listenfd);
return 0;
}
近期评论