/*************************************************************************
Author: Wan Xinshuo
Created Time: 2009年04月14日 星期二 11时32分34秒
File Name: server01.c
Description:
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BACKLOG 10 // how many pending connections queue will hold
void sigchld_handler(int s)
{
while(waitpid(-1, NULL, WNOHANG) > 0);//参考:me
}
int main(int argc, char *argv[] )
{
int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
struct sockaddr_in my_addr; // my address information
struct sockaddr_in their_addr; // connector's address information
socklen_t sin_size;
struct sigaction sa;
int yes=1;
char buff[100];
int nrecv;
if( argc != 2 )
{
fprintf(stderr, "usage: server port\n Ex:\n$ ./server01 8888\n");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(atoi(argv[1])); // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof my_addr) == -1) {
perror("bind");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
while(1) { // main accept() loop
sin_size = sizeof their_addr;
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
perror("accept");
continue;
}
printf("server: got connection from %s : %d \n",
inet_ntoa(their_addr.sin_addr), their_addr.sin_port);
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
while(1)
{
if (send(new_fd, "Hello,This is server message!", strlen("Hello,This is server message!"), 0) == -1)
{
perror("send");
continue;
}
if ( (nrecv = recv( new_fd, buff, 100, 0 )) > 0 )
{
buff[nrecv] = '\0';
printf(" buff = %s \n", buff );
}
else if( nrecv == 0 )
{
printf(" Remote client close\n");
break;
}
sleep(1);
}
close(new_fd);
exit(0);
}
close(new_fd); // parent doesn't need this
}
return 0;
}
/*************************************************************************
Author: Wan Xinshuo
Created Time: 2009年04月14日 星期二 11时33分18秒
File Name: client01.c
Description:
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXDATASIZE 100 // max number of bytes we can get at once
int main(int argc, char *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr; // connector'saddress information
if (( argc == 1) || (argc==2) ) {
fprintf(stderr,"usage: client hostname\nEx:\n$./client01 ip port\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) { // get the host info
herror("gethostbyname");
exit(1);
}
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET; // host byte order
their_addr.sin_port = htons(atoi(argv[2])); // short, network byte order
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);
if (connect(sockfd, (struct sockaddr *)&their_addr,
sizeof their_addr) == -1) {
perror("connect");
exit(1);
}
while( 1 )
{
if( send(sockfd, "hello, this is client message!", strlen("hello, this is client message!"), 0 ) == -1 )
{
perror("send");
}
if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1)
{
perror("recv");
}
else if( numbytes == 0 )
{
printf("Remote server has shutdown!\n");
break;
}
buf[numbytes] = '\0';
printf("Received: %s \n",buf);
sleep(1);
}
close(sockfd);
return 0;
}
编译:
gcc -o server01 server01.c
gcc -o client01 client01.c
运行:
$server01 8888
$client01 ip 8888
注: "ip" 为 server01所在的ip
server端先Ctrl+c关闭程序,客户端收到0,正常退出!
阅读(8747) | 评论(0) | 转发(0) |