Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5544698
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2013-08-22 18:07:11


服务器端代码:server.c

服务器,启动后,就处于 监听状态
每当有一个客户端进行连接时,server 都会单独 fork() 一个子进程, 在子进程中,进行具体的数据收发处理

  1. // server.c

  2. #include <stdio.h>
  3. #include <sys/socket.h>
  4. #include <sys/un.h>
  5. #include <unistd.h>
  6. #include <netinet/in.h>
  7. #include <linux/ipc.h>
  8. #include <linux/msg.h>
  9. #include <sys/types.h>
  10. #define MYPORT 6666
  11. #define MYIP "192.168.45.11"

  // 定义信息传输的格式
  1. struct msg{
  2.     long mtype;
  3.     int cmd;            
  4.     char s[3000];
  5. };
  6. struct msg m1,m2;

  7. int main()
  8. {
  9.     pid_t pid;
  10.     int sock;
  11.     int conn;
  12.     int addrlen;
  13.     int ret;
  14.     int opt;
  15.     int optlen;
  16.     struct sockaddr_in addr;


  17.     memset(&addr, 0x0, sizeof(addr));
  18.     addr.sin_family=AF_INET;
  19.     addr.sin_port=htons(MYPORT);
  20.     addr.sin_addr.s_addr=htonl(INADDR_ANY);

  21.     sock=socket(PF_INET, SOCK_STREAM, 0);
  22.     if(sock<0)
  23.     {
  24.         perror("socket"); return(-1);
  25.     }

  26.     /*绑定端口前,清除之前的绑定*/
  27.     opt=1;
  28.     optlen=sizeof(opt);
  29.     setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, optlen);

  30.     /* the next is bind the port */
  31.     ret=bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
  32.     if(ret)
  33.     {
  34.         perror("bind"); return(-1);
  35.     }
  36.     ret=listen(sock, 5);
  37.     if(ret)
  38.     {
  39.         perror("listen"); return(-1);
  40.     }
  41.     
  42.     while(1)
  43.     {
  44.         conn=accept(sock, (struct sockaddr *)&addr, &addrlen);
  45.         if(conn<0)
  46.         {
  47.             perror("accept");
  48.             break;
  49.         }
  50.         pid=fork();
  51.         if(pid==0)
  52.         {    /* children */
  53.             close(sock);
  54.             ret=read(conn, &m1, sizeof(struct msg));

  55.             disp(&m1);
  56.             msg_contrl();
  57.             write(conn, &m2, sizeof(struct msg));
  58.             fflush(stdout);
  59.             close(conn);
  60.             exit(0);
  61.         }
  62.         close(conn);
  63.     }
  64. }


  65. disp(struct msg *m)
  66. {
  67.     printf("\nreceive from client:\n");
  68.     printf("\nm.cmd=%d",m->cmd);
  69.     printf("\n---------------------------------------\n");
  70.     fflush(stdout);
  71.     return(0);
  72. }
  73. msg_contrl()
  74. {
  75.         int msgid1;
  76.         key_t key1;
  77.         m1.mtype=1234;
  78.         key1=ftok("/tmp",'b');
  79.         msgid1=msgget(key1, IPC_CREAT|0666);
  80.         msgsnd(msgid1, &m1, sizeof(struct msg)-sizeof(long),0);



  81.         int msgid2;
  82.         key_t key2;
  83.         m2.mtype=1235;
  84.         key2=ftok("/tmp",'c');
  85.         msgid2=msgget(key2, IPC_CREAT|0666);
  86.         msgrcv(msgid2, &m2, sizeof(struct msg)-sizeof(long),m2.mtype,0);
  87.         //printf("\nm2.s:%s",m2.s);
  88.         //printf("\nm2.cmd:%d",m2.cmd);

  89.         return 0;
  90.     
  91. }


客户端代码:client.c

    1. // client.c

  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <sys/un.h>
  4. #include <unistd.h>
  5. #include <netinet/in.h>
  6. #define MYPORT 6666
  7. #define MYIP "192.168.45.11"
  8. /* this is set the package form*/
  9. struct msg{
  10.     long mtype;
  11.     int cmd;
  12.     char s[3000];
  13. };
  14. struct msg m1,m2;

  15. int main()
  16. {
  17.     pid_t pid;
  18.     int sock;
  19.     int conn;
  20.     int addrlen;
  21.     int ret;
  22.     struct sockaddr_in addr;

  23.     memset(&addr, 0x0, sizeof(addr));
  24.     addr.sin_family=AF_INET;
  25.     addr.sin_port=htons(MYPORT);
  26.     addr.sin_addr.s_addr=inet_addr(MYIP);

  27.     sock=socket(PF_INET, SOCK_STREAM, 0);
  28.     if(sock<0)
  29.     {
  30.         perror("socket"); return(-1);
  31.     }
  32.     ret=connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
  33.     if(ret)
  34.     {
  35.         perror("connect");
  36.         return(-1);
  37.     }
  38.     input(&m1);
  39.     write(sock, &m1, sizeof(struct msg));
  40.     read(sock, &m2, sizeof(struct msg));
  41.     display(&m2);
  42.     return 0;
  43.     
  44. }

  45. //this is what you want to input
  46. input(struct msg *m)
  47. {
  48.     printf("\ncmd:");
  49.     scanf("%d",&m->cmd);
  50. }
  51. display(struct msg *m)
  52. {
  53.     printf("\nrecieved from server:\n");    
  54.     printf("\n m.s:%s\n",&m->s);
  55. }



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