Chinaunix首页 | 论坛 | 博客
  • 博客访问: 233647
  • 博文数量: 113
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1044
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-15 16:09
文章分类

全部博文(113)

文章存档

2016年(5)

2015年(108)

我的朋友

分类: LINUX

2015-03-25 13:46:11

简单Linux网络编程实现回射。此处服务器端server.c

点击(此处)折叠或打开

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <fcntl.h>
  10. #include <sys/shm.h>

  11. #define MYPORT 8887
  12. #define QUEUE 20
  13. #define BUFFER_SIZE 2048
  14. void do_service(int conn) /*定义一个do_service结构体,进行输出和输入操作。*/
  15. {
  16.     char buffer[BUFFER_SIZE];        
  17.     while(1)
  18.     {
  19.         memset(buffer,0,sizeof(buffer)); /*初始化*/
  20.         int len = recv(conn, buffer, sizeof(buffer),0);/*接收到的数据*/
  21.         if(len==0)
  22.         {
  23.             printf("client close\n");
  24.             break;
  25.         }
  26.         else if(len==-1)
  27.         {
  28.             perror("read");
  29.         }            
  30.         fputs(buffer, stdout); /*标准输出*/
  31.         send(conn, buffer, len, 0); /*标准发送*/
  32.     }
  33. }
  34. int main()
  35. {
  36.     ///定义sockfd
  37.     int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);

  38.     ///定义sockaddr_in
  39.     struct sockaddr_in server_sockaddr;
  40.     server_sockaddr.sin_family = AF_INET;
  41.     server_sockaddr.sin_port = htons(MYPORT);
  42.     server_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  43.     ///bind,成功返回0,出错返回-1
  44.     int on =1;
  45.     if(setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))==-1) /*获得套接口信息*/
  46.     {
  47.          perror("setsockopt");
  48.          exit(1);
  49.     }
  50.      printf("ip=%s port=%d\n",inet_ntoa(server_sockaddr.sin_addr),ntohs(server_sockaddr.sin_port));
  51.     if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
  52.     {
  53.         perror("bind");
  54.         exit(1);
  55.     }
  56.     
  57.     ///listen,成功返回0,出错返回-1
  58.     int listenfd=listen(server_sockfd,QUEUE) ; /*建立监听*/
  59.     if(listenfd<0)
  60.     {
  61.         perror("listen");
  62.         exit(1);
  63.     }

  64.     ///客户端套接字
  65.    
  66.     struct sockaddr_in client_addr;
  67.     socklen_t length = sizeof(client_addr);

  68.     ///成功返回非负描述字,出错返回-1
  69.    printf("accept ...\n");
  70.     int conn ;
  71.     pid_t pid;/*用fork()创建子进程*/
  72.     while(1) /*可以让多个客户端连接*/
  73.     {     if((conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length))<0) /*conn 为接收套接字*/
  74.      {
  75.           perror("connect");
  76.           exit(1);
  77.         
  78.          }

  79.         
  80.           pid =fork();
  81.          if(pid==-1)
  82.      {
  83.             perror("fork");
  84.             exit(1);
  85.            }
  86.          if(pid==0) /*子进程进行函数操作*/
  87.          {
  88.              close(server_sockfd);
  89.              do_service(conn);
  90.              exit(0);
  91.          }
  92.          else
  93.              close(conn); /*父进程进行函数操作*/
  94.     
  95.     
  96.     }
  97.     return 0;
  98. }


客户端client.c

点击(此处)折叠或打开

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <fcntl.h>
  10. #include <sys/shm.h>

  11. #define MYPORT 8887
  12. #define BUFFER_SIZE 2048

  13. int main()
  14. {
  15.     ///定义sockfd
  16.     int sock_cli = socket(AF_INET,SOCK_STREAM, 0);

  17.     ///定义sockaddr_in
  18.     struct sockaddr_in servaddr;
  19.     memset(&servaddr, 0, sizeof(servaddr)); /*初始化*/
  20.     servaddr.sin_family = AF_INET; ///IPv4协议
  21.     servaddr.sin_port = htons(MYPORT); ///服务器端口
  22.     servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ///服务器ip
  23.     
  24.     ///连接服务器,成功返回0,错误返回-1
  25.     if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
  26.     {
  27.         perror("connect");
  28.         exit(1);
  29.     }
  30.     printf("ip=%s port=%d\n",inet_ntoa(servaddr.sin_addr),ntohs(servaddr.sin_port));  ///输出服务器IP地址和端口

  31.     char sendbuf[BUFFER_SIZE];
  32.     char recvbuf[BUFFER_SIZE];
  33.     while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL) ///键盘输入
  34.     {
  35.         send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送
  36.         recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
  37.         fputs(recvbuf, stdout);

  38.         memset(sendbuf, 0, sizeof(sendbuf));
  39.         memset(recvbuf, 0, sizeof(recvbuf));
  40.     }

  41.     close(sock_cli);
  42.     return 0;
  43. }

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