int main(void) { //signal(SIGCHLD, SIG_IGN); signal(SIGPIPE,SIG_IGN); signal(SIGCHLD, handle_sigchld); int listenfd; if ((listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) /* if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)*/ ERR_EXIT("socket"); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8001); //servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); /*inet_aton("127.0.0.1", &servaddr.sin_addr);*/ int on = 1; if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) ERR_EXIT("setsockopt"); if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) ERR_EXIT("bind"); if (listen(listenfd, SOMAXCONN) < 0) ERR_EXIT("listen"); struct sockaddr_in peeraddr; socklen_t peerlen = sizeof(peeraddr); int conn; pid_t pid; while (1) { if ((conn = accept(listenfd, (struct sockaddr*)&peeraddr, &peerlen)) < 0) ERR_EXIT("accept"); printf("ip=%s port=%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port)); pid = fork(); if (pid == -1) ERR_EXIT("fork"); if (pid == 0)//child { close(listenfd); echo_srv(conn); exit(EXIT_SUCCESS); } else//father { //close(conn);//注意引用计数的问题 } } return 0; }
//socket bind listen accept read write close int main(int argc, const char *argv[]) { signal(SIGCHLD, handle_sigchld); //socket int listen_fd = socket(AF_INET, SOCK_STREAM, 0); if (listen_fd < 0) ERR_EXIT("server socket"); //deal with timewait int on = 1; if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) ERR_EXIT("server setsockopt"); //bind struct sockaddr_in server_addr; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8989); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) ERR_EXIT("server bind"); //listen if (listen(listen_fd, SOMAXCONN) < 0) ERR_EXIT("server listen"); //accept int data_fd; struct sockaddr_in peer_addr; socklen_t peer_addr_len = sizeof(peer_addr); while(1) { if ((data_fd = accept(listen_fd, (struct sockaddr *)&peer_addr, &peer_addr_len)) < 0) ERR_EXIT("server accept"); //print client's ip and port printf("client's ip is :%s, port is :%d\n", inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port)); pid_t pid = fork(); if (pid < 0) ERR_EXIT("fork"); else if (0 == pid) { //child close(listen_fd); echo_srv(data_fd); close(data_fd); exit(EXIT_SUCCESS); } //farther close(data_fd); } //close close(listen_fd); return 0; }
void* thread_routine(void *arg) { /* 主线程没有调用pthread_join等待线程退出 */ pthread_detach(pthread_self()); //剥离线程,避免产生僵线程 /*int conn = (int)arg;*/ int conn = *((int*)arg); free(arg); echo_srv(conn); printf("exiting thread ...\n"); return NULL; }
int main(void) { int sock; if((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) ERR_EXIT("socket"); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(5188); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) ERR_EXIT("bind"); echo_srv(sock); return 0; }