9.多方消息收发

服务端代码:

sv1.c

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>

int main(int argc,char **argv)
{
       int s_fd;
       int c_fd;
       int n_read;
       char readBuf[128];

       int mark = 0;
       char msg[128] = {0};
       //char *msg = "i get your connect"; 

       struct sockaddr_in s_addr;
       struct sockaddr_in c_addr;

       if(argc != 3)
       {
             printf("param in not good\n");
             exit(-1);
       }

       memset(&s_addr,0,sizeof(struct sockaddr_in));//清空数据
       memset(&c_addr,0,sizeof(struct sockaddr_in));

       //1.socket
       s_fd = socket(AF_INET,SOCK_STREAM,0);//创建套接字
       if(s_fd == -1)//出错
       {
           perror("socket");
           exit(-1);
       }

       //struct sockaddr_in s_addr;
       s_addr.sin_family = AF_INET;//网络协议
       s_addr.sin_port = htons(atoi(argv[2]));//端口号
       inet_aton(argv[1],&s_addr.sin_addr);
       //2.bind
       bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

       //3.listen
       listen(s_fd,10);//监听

       //4.accept
       int clen = sizeof(struct sockaddr_in);
       while(1)
       {
          c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);//监听到有客户端>接入,接受一个连接
          if(c_fd == -1)//c_fd != -1代表有新的连接
          {
                perror("accept");
          }

          mark++;
          printf("get connect: %s\n",inet_ntoa(c_addr.sin_addr));
          if(fork() == 0)
          {
               if(fork() == 0)
               {
                     while(1)
                     {
                       //memset(msg,0,sizeof(msg));
                       sprintf(msg,"welcom No. %d client\n",mark);
                       //gets(msg);
                               write(c_fd,msg,strlen(msg));
                       sleep(3);
                     }
               }

               //5.read
               while(1)
               {
                  memset(readBuf,0,sizeof(readBuf));
                  n_read = read(c_fd,readBuf,128);
                  if(n_read == -1)//-1代表失败
                  {
                       perror("read");
                  }
                  else
                  {
                       printf("get message:%d,%s\n",n_read,readBuf);
                  }
               }

               break;
          }

          //6.write
       }

       return 0;
}
   

编译:gcc sv1.c -o sv

客户端代码:

cl.c 

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>

int main(int argc,char** argv)
{
       int c_fd;
       int n_read;
       char readBuf[128];

       //char *msg = "msg from client";
       char msg[128] = {0};
       struct sockaddr_in c_addr;


       memset(&c_addr,0,sizeof(struct sockaddr_in));//清空数据
       if(argc != 3)
       {
            printf("param is not good\n");
            exit(-1);
       }

       //1.socket
       c_fd = socket(AF_INET,SOCK_STREAM,0);//创建套接字
       if(c_fd == -1)//出错
       {
           perror("socket");
           exit(-1);
       }

       //struct sockaddr_in s_addr;
       c_addr.sin_family = AF_INET;//网络协议
       c_addr.sin_port = htons(atoi(argv[2]));//端口号
       inet_aton(argv[1],&c_addr.sin_addr);


       //2.connect 连接
      if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))== -1)
      {
             perror("connect");
             exit(-1);
      }


       while(1)
       {
             if(fork()==0)
             {
                  while(1)
                  {
                    memset(msg,0,sizeof(msg));
                    printf("Input: ");
                    gets(msg);
                    write(c_fd,msg,strlen(msg));//发信息
                  }
             }
             while(1)
             {
                memset(readBuf,0,sizeof(readBuf));
                n_read = read(c_fd,readBuf,128);
                if(n_read == -1)//-1代表失败
                {
                     perror("read");
                }
                else
                {
                     printf("get message from server:%d,%s\n",n_read,readBuf);
                     //printf("get: ");
                }
             }
       }
       //3.send  发送


       //4.read


       //6.write

       return 0;
}
  

编译:gcc cl.c  -o sv

运行流程:

先运行:./sv 192.168.0.104 8002

后运行:./cl 192.168.0.104 8002

运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值