Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14890
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-15 15:04
个人简介

计C学生党,HTML+CSS+DIV 出门,熟悉php,asp.net 熟悉Clanguage,Java , C# ,掌握初阶网络知识,目前主要学习:UNIX 网络编程、Linux/UNIX 系统编程、ACM

文章分类

全部博文(7)

文章存档

2016年(7)

我的朋友
最近访客

分类: 网络与安全

2016-06-04 11:32:03

结果输出:
------------------------------------------------------
客户端:
xx@xxxxxx:~/Public/C$ ./postBackCli.out 127.0.0.1
connect OK
aaa
aaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbb
c
c
#
close OK
xx@xxxxxx:~/Public/C$
------------------------------------------------------
服务器端:
xx@xxxxxx:~/Public/C$ ./postBackSrv.out
======waiting for client's request======
from:127.0.0.1,port:45050
---------华丽的分割线---------
postBackCli.c

点击(此处)折叠或打开

  1. //main函数中详细注释可查看博主--获取服务器时间实例--博文,内有较详细注释
  2. //部分细节写的代码较草率,博主新入门,前辈勿喷
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<string.h>
  6. #include<errno.h>
  7. #include<sys/types.h>
  8. #include<sys/socket.h>
  9. #include<netinet/in.h>
  10.   
  11. #define MAXLINE 4096
  12. void str_cli(FILE *fp,int sockfd);

  13. int main(int argc, char** argv)
  14. {
  15.     int sockfd, n,rec_len;
  16.     char recvline[4096], sendline[4096];
  17.     char buf[MAXLINE];
  18.     struct sockaddr_in servaddr;
  19.     
  20.     if( argc != 2){
  21.     printf("usage: ./client \n");
  22.     exit(0);
  23.     }
  24.     
  25.     if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
  26.     printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
  27.     exit(0);
  28.     }
  29.     
  30.     memset(&servaddr, 0, sizeof(servaddr));
  31.     servaddr.sin_family = AF_INET;
  32.     servaddr.sin_port = htons(8000);
  33.     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
  34.     printf("inet_pton error for %s\n",argv[1]);
  35.     exit(0);
  36.     }
  37.     
  38.     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
  39.     printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
  40.     exit(0);
  41.     }
  42.     printf("connect OK\n");
  43.     str_cli(stdin,sockfd);
  44.     close(sockfd);
  45.     printf("close OK\n");
  46.     exit(0);
  47. }
  48. //回射处理函数
  49. void str_cli(FILE *fp,int sockfd)
  50. {
  51.     char sendline[MAXLINE],recvline[MAXLINE];//定义两个缓冲区
  52.     while (fgets(sendline,MAXLINE,fp)!= NULL)//从标准输入输入到sendline中
  53.     {
  54.       if(sendline[0] == '#')break;//如果输入#则退出循环,同时结束本次回射程序
  55.       write(sockfd,sendline,strlen(sendline));//将sendline缓冲区中的数据写到"套接字"
  56.       read(sockfd,recvline,MAXLINE);//从套接字读数据到recvline中
  57.       fputs(recvline,stdout);//从recvline缓冲区读出到标准输出中
  58.       bzero(recvline,sizeof(recvline));//清空接受缓冲区,每次都是最新的数据【需注意】
  59.     }
  60. }
postBackSrv.c

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<errno.h>
  5. #include<sys/types.h>
  6. #include<sys/socket.h>
  7. #include<netinet/in.h>
  8. #define DEFAULT_PORT 8000 //默认端口
  9. #define MAXLINE 4096
  10. void str_echo(int sockfd);
  11. int main(int argc, char** argv)
  12. {
  13.     int socket_fd, connect_fd;
  14.     struct sockaddr_in servaddr,cliaddr;
  15.     char buff[MAXLINE],temp[MAXLINE];
  16.     int n;
  17.     uint32_t len;
  18.      //初始化Socket
  19.     if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
  20.     {
  21.     printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
  22.     exit(0);
  23.     }
  24.     //初始化
  25.     memset(&servaddr, 0, sizeof(servaddr));
  26.     servaddr.sin_family = AF_INET;
  27.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
  28.     servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT
  29.   
  30.     //将本地地址绑定到所创建的套接字上
  31.     if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
  32.     printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
  33.     exit(0);
  34.     }
  35.     //开始监听是否有客户端连接
  36.     if( listen(socket_fd, 10) == -1){
  37.     printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
  38.     exit(0);
  39.     }
  40.     printf("======waiting for client's request======\n");
  41.     while(1){
  42.     len=sizeof(cliaddr);
  43.     //阻塞直到有客户端连接
  44.         connect_fd = accept(socket_fd, (struct sockaddr *)&cliaddr,&len);
  45.  
  46.     //向客户端发送回应数据
  47.         if(!fork())//进入子进程,在子进程服务终止时会给父进程发送一个SIGCHLD信号,父进程未处理,子进程进入僵死状态,必须清理僵死状态,这里牵扯Unix信号的处li.
  48.     {    //子进程在其内部关闭监听套接字
  49.         close(socket_fd);
  50.                str_echo(connect_fd);
  51.         //输出客户协议信息
  52.         printf("\nfrom:%s,port:%d\n",(char *)inet_ntop(AF_INET,&cliaddr.sin_addr,temp,sizeof(temp)),ntohs(cliaddr.sin_port));
  53.      close(connect_fd);
  54.      exit(0);
  55.       }
  56.         close(connect_fd);
  57.     }
  58.     close(socket_fd);
  59. }
  60. void str_echo(int sockfd)
  61. {
  62.     ssize_t n;
  63.     char buf[MAXLINE];
  64.     while(( n=read(sockfd,buf,MAXLINE))>0)
  65.       write(sockfd,buf,n);
  66.     if(n<0 && errno==EINTR)
  67.      perror("str_echo:red error");
  68. }




阅读(537) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~