/* Author: bhw EMail: bhwshx@163.com Date: Thu 12 Mar 2009 03:26:03 PM CSTa*/ //实现最简单的网络聊天功能(服务器版) #include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #define PORT 8000 #define BUFSIZE 2048 int main(int argc, char *argv[]) { char rcvbuf[BUFSIZE], sendbuf[BUFSIZE]; int listenfd; struct sockaddr_in servAddr; unsigned port = PORT; if(argc != 1) { port = atoi(argv[1]); } printf("TCP Server is starting at port %d.../n", port); listenfd = socket(AF_INET, SOCK_STREAM, 0); if(listenfd == -1) { printf("Invalid socket!/n"); return 1; } printf("Server is listening.../n"); bzero(&servAddr, sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_port = htons(port); servAddr.sin_addr.s_addr = htonl(INADDR_ANY); printf("Binding server to port %d/n", port); if(bind(listenfd, (struct sockaddr *)&servAddr, sizeof(struct sockaddr)) != 0) { close(listenfd); printf("Binding error/n"); return 1; } printf("Binding server to port %d successfully./n", port); if(listen(listenfd, 3) != 0) { close(listenfd); printf("listen error/n"); return 1; } printf("Waiting client.../n"); while(1) { size_t rcvLen; struct sockaddr_in cliAddr; size_t cliAddrLen = sizeof(cliAddr); pid_t pid; char msg[30] = "Welcome/n"; char from[20]; int connfd = accept(listenfd, (struct sockaddr *)&cliAddr, &cliAddrLen); if(connfd < 0) { close(listenfd); printf("accept error/n"); return 1; } strcpy(from, inet_ntoa(cliAddr.sin_addr)); pid = fork(); if(pid == 0) //child process { close(listenfd); printf("client ip = %s/n", from); write(connfd, msg, strlen(msg));//print welcome UI to client pid = fork(); while(1) { if(pid == 0) //child's child process responsible for receiving { bzero(rcvbuf, BUFSIZE); if((rcvLen = read(connfd, rcvbuf, BUFSIZE)) < 0) { printf("read from client error/n"); } else if(rcvLen > 0) printf("From %s: %s/n", from, rcvbuf); else return 1; } if(pid > 0) //child process responsible for sending { bzero(sendbuf, BUFSIZE); if(fgets(sendbuf, BUFSIZE, stdin) != NULL) { write(connfd, sendbuf, strlen(sendbuf)); } } } close(connfd); printf("client closed!/n"); }//if(fork)'s else if(pid > 0) close(connfd);//father process else return 1; }//while(1)'s close(listenfd); return 0; }