Tcp 并发服务器,多线程,多进程实现

机械臂 

#include "head.h"
/*TCP 客户端
 控制机械臂
*/
#define PORT 8888
#define IP "192.168.125.62"
int main(int argc, char const *argv[])
{
  //创建套接字
  int cfd = -1; //文件标识符

  if ((cfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    perror("socket error");
    return -1;
  }
  printf("cfd = %d \n", cfd);
  //链接服务器
  //填充服务器地址信息结构体
  struct sockaddr_in s_a;
  s_a.sin_family = AF_INET;
  s_a.sin_port = htons(PORT);
  s_a.sin_addr.s_addr = inet_addr(IP);
  //链接
  if (connect(cfd, (struct sockaddr *)&s_a, sizeof(s_a)) == -1)
  {
    perror("connect error");
    return -1;
  }
  printf("connect success \n");

  //数据收发
  char wbuf[5] = {0xff, 0x02, 0x00, 0x00, 0xff};
  char value = 0;
  while (1)
  {
    //请输入内容
    // printf("plesase enter control:");
    value = getchar();
    switch (value)
    {
    case 'W':
    case 'w':

    {
      wbuf[2] = 0x00;
      wbuf[3] += 5;
      if (wbuf[3] >= 90)
      {
        wbuf[3] = 90;
      }
      send(cfd, wbuf, sizeof(wbuf), 0);
    }

    break;

    case 'Q':
    case 'q':
    {
      wbuf[2] = 0x00;
      wbuf[3] -= 5;
      if (wbuf[3] <= -90)
      {
        wbuf[3] = -90;
      }
      send(cfd, wbuf, sizeof(wbuf), 0);
    }
    break;
    case 'E':
    case 'e':
    {

      wbuf[2] = 0x01;
      wbuf[3] += 2;
      if (wbuf[3] >= 180)
      {
        wbuf[3] = 180;
      }
      send(cfd, wbuf, sizeof(wbuf), 0);
    }
    break;
    case 'R':
    case 'r':
    {

      wbuf[2] = 0x01;
      wbuf[3] -= 2;
      if (wbuf[3] <= 0)
      {
        wbuf[3] = 0;
      }
      send(cfd, wbuf, sizeof(wbuf), 0);
    }
    break;
    default:
      break;
    }
  }

  close(cfd);

  return 0;
}

tcp多线程

#include "head.h"
/*
Tcp 多线程实现并行服务器
*/
#define IP "192.168.125.65"
#define PORT 8080
struct pthread_ds
{
  int tid;
  struct sockaddr_in cin;
};

//处理收发
int deal_cli_msg(int newfd, struct sockaddr_in cin)
{
  //收发数据
  char rbuf[128] = "";
  while (1)
  {
    bzero(rbuf, sizeof(rbuf));
    int res = recv(newfd, rbuf, sizeof(rbuf), 0);
    if (res == 0)
    {
      printf("客户端下线\n");
      break;
    }
    printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);
    // //链接一个字符串后发回去
    strcat(rbuf, "*_*");
    //发送信息 以阻塞的形式写入数据
    send(newfd, rbuf, sizeof(rbuf), 0);
  }
  close(newfd);
  pthread_exit(NULL);
  return 0;
}

void *task(void *arg)
{
  int newfd = (*(struct pthread_ds *)arg).tid;
  struct sockaddr_in cin = (*(struct pthread_ds *)arg).cin;
  deal_cli_msg(newfd, cin);
}
int main(int argc, char const *argv[])
{
  /*
 1, socket
 2,bind
 3,listen
 4,accept
 5,read
 6,close
 */
  int sfd = -1;
  sfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sfd == -1)
  {
    perror("socket error");
    return -1;
  }
  // bind 结构体 将ip 端口号 转化为网络字节序
  struct sockaddr_in s_a;
  s_a.sin_family = AF_INET;
  s_a.sin_port = htons(PORT);
  s_a.sin_addr.s_addr = inet_addr(IP);
  //绑定
  int rest = bind(sfd, (struct sockaddr *)&s_a, sizeof(s_a));
  if (rest == -1)
  {
    perror("bind error");
    return -1;
  }
  printf("bind success \n");
  //listen
  if (listen(sfd, 128) == -1)
  {
    perror("listen error");
    return -1;
  }
  printf("listen success\n");

  //accept
  struct sockaddr_in cin;
  socklen_t socklen = sizeof(cin);
  int newfd = -1;
  pthread_t tid = -1;
  //循环创建套接字
  while (1)
  {
    //创建用于收发消息的套接字
    newfd = accept(sfd, (struct sockaddr *)&cin, &socklen);
    if (newfd == -1)
    {
      perror("accept error");
      return -1;
    }
    printf("[%s:%d]链接成功\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));

    struct pthread_ds info = {newfd, cin};

    if (pthread_create(&tid, NULL, task, &info) != 0)
    {
      perror("pthreadcreate error");
      return -1;
    }

    pthread_detach(tid);
  }

  return 0;
}

 tcp多进程

/*
并发服务器
多进程
*/
#include "head.h"
/*TCP 服务端*/
#define PORT 8888
#define IP "192.168.125.65"
//处理收发
int deal_cli_msg(int newfd, struct sockaddr_in cin)
{
  //收发数据
  char rbuf[128] = "";
  while (1)
  {
    bzero(rbuf, sizeof(rbuf));
    int res = recv(newfd, rbuf, sizeof(rbuf), 0);
    if (res == 0)
    {
      printf("客户端下线\n");
      break;
    }
    printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);

    // //链接一个字符串后发回去
    strcat(rbuf, "*_*");
    //发送信息 以阻塞的形式写入数据
    send(newfd, rbuf, sizeof(rbuf), 0);
  }
  close(newfd);
  return 0;
}

//信号处理函数 回收进程资源
void handle(int signo){
   if (signo == SIGCHLD)
   {
     while (waitpid(-1,NULL,WNOHANG)>0);
   }
   
}

int main(int argc, char const *argv[])
{
//信号处理函数
if (signal(SIGCHLD,handle)== SIG_ERR)
{
   perror("signal error");
   return -1;
}

  //创建套接字
  int sfd = -1; //文件标识符
  /*
  AF_INET 跨主机的Ipv4
  SOCK_STREAM  tcp通讯
  */
  if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    perror("socket error");
    return -1;
  }
  printf("sfd = %d \n", sfd);

  // bind 结构体 将ip 端口号 转化为网络字节序
  struct sockaddr_in s_a;
  s_a.sin_family = AF_INET;
  s_a.sin_port = htons(PORT);
  s_a.sin_addr.s_addr = inet_addr(IP);
  //绑定
  int rest = bind(sfd, (struct sockaddr *)&s_a, sizeof(s_a));
  if (rest == -1)
  {
    perror("bind error");
    return -1;
  }
  printf("bind success \n");

  //将套接字设置成被动监听状态
  if (listen(sfd, 128) == -1)
  {
    perror("listen error");
    return -1;
  }
  printf("listen success\n");

  struct sockaddr_in cin;
  socklen_t socklen = sizeof(cin);
  int newfd = -1;
  pid_t pid = -1;
  while (1)
  {
    //接收客户端链接请求
    if ((newfd = accept(sfd, (struct sockaddr *)&cin, &socklen)) == -1)
    {
      /* code */
      perror("accept error");
      return -1;
    }
    printf("[%s:%d]链接成功\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
    pid = fork();
    if (pid > 0)
    {
      close(newfd);
    }
    else if (pid == 0)
    {
      close(sfd);
      deal_cli_msg(newfd, cin);
      exit(EXIT_SUCCESS);
      printf("退出成功\n");
    }
    else
    {
      perror("fork error");
      return -1;
    }
  }
  close(sfd);
  return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值