Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1055708
  • 博文数量: 288
  • 博客积分: 10306
  • 博客等级: 上将
  • 技术积分: 3182
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-12 17:00
文章分类

全部博文(288)

文章存档

2011年(19)

2010年(38)

2009年(135)

2008年(96)

我的朋友

分类: 系统运维

2008-09-15 10:37:54

 

 
最近很想培养一两个可以继续做服务器开发的弟子出来,但是苦于一时找不到合适的例子,而最近又实在是太懒惰了。哎,感谢原作者。
原文地址:http://hi.baidu.com/whs08/blog/item/cadea5fb63b2cb136c22eb60.html

声明:代码未经过测试。

这个服务器通过一个连接向客户发送字符串"Hello world!"

服务器首先创建出一个Socket ,然后将该Socket与本地端口绑定,成功之后在相应的Socket监听,当accept捕捉到一个连接服务器请求时,就会生成一个一个新的的Socket,并通过这个新的socket向客户端发送字符串"Hello World!",然后关闭该Socket.

fork()函数生成一个子进程来处理数据传输部分。

Server.c
  1. #include     
  2. #include     
  3. #include     
  4. #include     
  5. #include     
  6. #include     
  7. #include     
  8. #include     
  9. #define MYPORT 3490 /*服务器监听端口号 */    
  10. #define BACKLOG 10 /* 最大同时连接请求数 */    
  11. int main(int argc ,char **argsv[])    
  12. {   
  13. int sockfd ,new_fd;   
  14. struct sockaddr_in my_addr;/*本机地址信息*/  
  15. struct sockaddr_in their_addr;/*客户地址信息*/  
  16. int sin_size;   
  17.   
  18.     /*服务器端通常调用顺序 socket(),bind(),listen*/  
  19.   
  20.   
  21. if(-1 == (sockfd = socket(AF_INET,SOCK_STREAM,0)))   
  22. {/*检测错误*/  
  23.    perror("socket error");   
  24.    exit(1);   
  25. }   
  26.   
  27. my_addr.sin_family = AF_INET;   
  28. my_addr.sin_port = htons(MYPORT);/*字节顺序转换函数*/  
  29. my_addr.sin_addr.s_addr = INADDR_ANY ;   
  30. bzero(&(my_addr.sin_zero),8);/*清零*/  
  31. //或者用memset(&addr,0,sizeof(struct sockaddr_in));   
  32.   
  33. if(-1 == bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)))   
  34. {/*检测错误*/  
  35.    perror("bind error");   
  36.    exit(1);   
  37. }   
  38.   
  39. if(-1 == listen(sockfd,BACKLOG))   
  40. {/*检测错误*/  
  41.    perror("listen error");   
  42.    exit(1);   
  43. }   
  44.   
  45. while(1)   
  46. {   
  47.    sin_size = sizeof(struct sockaddr_in);   
  48.    if(-1 == (new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size)))   
  49.    {   
  50.     perror("accept error");   
  51.       continue;   
  52.    }   
  53.    printf("server : get connetion from %s",inet_ntoa(their_addr.sin_addr));   
  54.    if(!fork())/*子进程代码*/  
  55.    {   
  56.     if(-1 == send(new_fd,"Hello, world !",14,0))   
  57.     {   
  58.      perror("send error");   
  59.      continue;   
  60.     }   
  61.     close(new_fd);   
  62.     exit(0);   
  63.    }   
  64.    close(new_fd);   /* 父进程不再需要该socket */    
  65.    //waitpid(-1,NULL,WNOHANG) > 0 /*等待子进程结束,清除子进程所占用资源*/    
  66. }   
  67. }    

Client.c
  1. #include     
  2. #include     
  3. #include     
  4. #include     
  5. #include     
  6. #include     
  7. #include     
  8. #include     
  9. #define PORT 3490    
  10. #define MAXDATASIZE 100 /*每次最大数据传输量 */    
  11. int main(int argc, char *argv[])    
  12. {    
  13. int sockfd, numbytes;    
  14. char buf[MAXDATASIZE];    
  15. struct hostent *he;    
  16. struct sockaddr_in their_addr;    
  17.   
  18. if (argc != 2) {    
  19.    fprintf(stderr,"usage: client hostname");    
  20. exit(1);    
  21. }    
  22.   
  23. if((he=gethostbyname(argv[1]))==NULL) {    
  24.    herror("gethostbyname");    
  25.    exit(1);   
  26. }    
  27.   
  28. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {    
  29.    perror("socket");    
  30.    exit(1);    
  31. }    
  32.   
  33. their_addr.sin_family=AF_INET;    
  34. their_addr.sin_port=htons(PORT);    
  35. their_addr.sin_addr = *((struct in_addr *)he->h_addr);    
  36. bzero(&(their_addr.sin_zero),8);    
  37.   
  38. if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {    
  39.    perror("connect");   
  40.    exit(1);    
  41. }    
  42. if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {    
  43.     perror("recv");    
  44.        exit(1);    
  45. }    
  46.   
  47. buf[numbytes] = '\0';    
  48. printf("Received: %s",buf);    
  49. close(sockfd);    
  50. return 0;    
  51. }    
阅读(610) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~