- 论坛徽章:
- 0
|
Linux & C++ 编程问题
echo_server_procs1.cpp
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <arpa/inet.h>;
#include <netdb.h>;
#include <iostream>;
#include <unistd.h>;
#include <stdlib.h>;
#include <signal.h>;
using namespace std;
int main(int argc, char *argv[]){
int sock, newsock, stat, pid, rc;
unsigned int cliaddrlen;
struct sockaddr_in myaddr, cliaddr;
struct hostent *hostptr;
char buffer[2048], ip[64];
if(argc != 2) {
cerr << "usage: echo-server port-num\n"; exit(1);
}
cout << "TCP echo server (concurrent using processes)\n";
signal(SIGCHLD,SIG_IGN);
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0) { cerr << "cant open socket\n"; exit(1);}
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(atoi(argv[1]));
stat = bind(sock, (struct sockaddr *) &myaddr, sizeof(myaddr));
if(stat < 0) { cerr << "cant bind\n"; exit(1);}
listen(sock,5); // make ready for accept
cerr << "ready to accept connections\n";
while(true) {
cliaddrlen = sizeof(struct sockaddr_in);
newsock=accept(sock,(struct sockaddr *) &cliaddr,&cliaddrlen);
if(newsock < 0) { cerr << "accept error\n"; exit(1);}
hostptr = gethostbyaddr((char *)&cliaddr.sin_addr,
sizeof(struct in_addr),AF_INET);
if(hostptr != 0)
cerr << "connection from: " << hostptr->;h_name << "\n";
else if(inet_ntop(AF_INET,&cliaddr.sin_addr,ip,64)!=0)
cerr << "connection from: " << ip << "\n";
else
cerr << "cannot find IP address\n";
pid = fork();
if(pid < 0) { cerr << "fork failed\n"; }
else if(pid == 0) { // new child clone process
close(sock);
rc = read(newsock,buffer,204;
while(rc >; 0) {
write(newsock,buffer,rc);
rc = read(newsock,buffer,204;
}
close(newsock);
exit(0);
}
// parent, close our copy of newsock and loop
close(newsock);
}
} |
|