Linux网络编程——服务器客户端实现双方聊天及多方消息收发,客户端的实现

客户端的实现,实现双方聊天及多方消息收发


再学习这篇内容前,需要了解下上章服务器相关内容。linux服务器

客户端实现

与服务端相比,客户端实现的操作和步骤就简单很多。
需要套接字和connect两个步骤
代码实现如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>

//int connect(int sockfd, const struct sockaddr *addr,
//                   socklen_t addrlen);
int main()
{
  int c_fd;
  char readbuf[128];
  struct sockaddr_in c_addr;
  memset(&c_addr,0,sizeof(struct sockaddr_in));
  c_fd = socket(AF_INET,SOCK_STREAM,0);
  c_addr.sin_family = AF_INET;
  c_addr.sin_port   = htons(8666);
  inet_aton("192.168.1.88",&c_addr.sin_addr);
  connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));//配置内容与客户端一样
  printf("get success,连接设备的IP为%s\n",inet_ntoa(c_addr.sin_addr));
  read(c_fd,readbuf,sizeof(readbuf));
  write(c_fd,"hello i am client",strlen("hello i am client"));
  printf("content:%s\n",readbuf);
  return 0;
}

我们再配合下面服务器代码

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
//ssize_t read(int fd, void *buf, size_t count);

int main()
{
  int s_fd;
  char readbuf[128];
  struct sockaddr_in s_addr;
  struct sockaddr_in c_addr;
  memset(&s_addr,0,sizeof(struct sockaddr_in));
  memset(&c_addr,0,sizeof(struct sockaddr_in));
  s_fd = socket(AF_INET,SOCK_STREAM,0);
  s_addr.sin_family = AF_INET;
  s_addr.sin_port   = htons(8666);
  inet_aton("192.168.1.88",&s_addr.sin_addr);
  bind(s_fd, (struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
  listen(s_fd,10);
  int clen = sizeof(struct sockaddr_in);
  int c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
  printf("get success,连接设备的IP为%s\n",inet_ntoa(s_addr.sin_addr));
  write(c_fd,"hello i am linux",strlen("hello i am linux"));
  read(c_fd,readbuf,sizeof(readbuf));
  printf("content:%s\n",readbuf);
  return 0;
}

就能实现双机通信操作
效果如下:
在这里插入图片描述

多方向服务器传送数据

服务端

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
//ssize_t read(int fd, void *buf, size_t count);

int main(int argc,char **argv)
{
  int mark = 0;
  int s_fd;
  int c_fd;
  if(argc!=3){
     printf("value error");
     exit(0);
  }
  char readbuf[128];
  char writebuf[128];
  char markbuf[128];
  struct sockaddr_in s_addr;
  struct sockaddr_in c_addr;
  memset(&s_addr,0,sizeof(struct sockaddr_in));
  memset(&c_addr,0,sizeof(struct sockaddr_in));
  s_fd = socket(AF_INET,SOCK_STREAM,0);
  s_addr.sin_family = AF_INET;
  s_addr.sin_port   = htons(atoi(argv[2]));
  inet_aton(argv[1],&s_addr.sin_addr);
  bind(s_fd, (struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
  listen(s_fd,10);
  int clen = sizeof(struct sockaddr_in);
  while(1){
         c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
         mark++;
         printf("get success,连接设备的IP为%s\n",inet_ntoa(s_addr.sin_addr));
         if(fork()==0){
               if(fork()==0){
                    while(1){
                       sprintf(markbuf,"client %d connect!",mark);
                       write(c_fd,markbuf,strlen(markbuf));
                       sleep(10);
                  }
               }

               while(1){
               memset(readbuf,0,sizeof(readbuf));
               read(c_fd,readbuf,sizeof(readbuf));
               printf("%s\n",readbuf);
               }
            }
          }

  return 0;
}
~                                                                       

客户端

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>

//int connect(int sockfd, const struct sockaddr *addr,
//                   socklen_t addrlen);
int main(int argc,char **argv)
{
  int c_fd;
  char readbuf[128];
  char writebuf[128];
  struct sockaddr_in c_addr;
  memset(&c_addr,0,sizeof(struct sockaddr_in));
  c_fd = socket(AF_INET,SOCK_STREAM,0);
  c_addr.sin_family = AF_INET;
  c_addr.sin_port   = htons(atoi(argv[2]));
  inet_aton(argv[1],&c_addr.sin_addr);
  connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));
  printf("get success,连接设备的IP为%s\n",inet_ntoa(c_addr.sin_addr));
  while(1){
         if(fork()==0){
          while(1){
            memset(readbuf,0,sizeof(readbuf));
            read(c_fd,readbuf,sizeof(readbuf));
            printf("%s\n",readbuf);}
         }
         while(1){
           memset(writebuf,0,sizeof(readbuf));
           printf("input:");
           scanf("%s",writebuf);
           write(c_fd,writebuf,strlen(writebuf));
         }
  }
  return 0;
}

可以与多台设备连接
效果如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pg_hj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值