使用qt/tcp进行设备监听

#include "Develop.h"
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <pthread.h>

struct Bag {
  unsigned short int magic_number;
  unsigned int size;
  unsigned short int type;
  unsigned long long int padding;

};

struct s_info {
  struct sockaddr_in cliaddr;
  int connfd;
};

void *do_work(void *arg) {
  s_info Cfd = *(s_info *) arg;
  auto cfd = Cfd.connfd;
  Bag Recv{0,0,0,0};
  Bag Send{12345,0,1,0};
  recv(cfd, &Recv, 16, 0);
  std::cout<<Recv.magic_number<<" "<<Recv.size<<" "<<Recv.type<<std::endl;
  if(Recv.magic_number!=12345) return nullptr;
  if(Recv.type == 1){
    send(cfd,&Send,16,0);
    std::cout<<"1231"<<std::endl;
  }
  close(cfd);
  return nullptr;
}

int main() {
  int lfd = -1, cfd;
//    int cfd = -1;
  LISTEN(lfd);
  int i = 0;

  s_info inf{};
  sockaddr_in cld{};

  while (true) {
    ACCEPT(lfd, cfd, cld);
    pthread_t tid;
//    s_info bagHead[128];
    inf.connfd = cfd;
    inf.cliaddr = cld;
//    do_work((void *) &bagHead[i]);
    pthread_create(&tid, nullptr, do_work, (void *) &inf);
    pthread_detach(tid);
    i++;
  }

}
//
// Created by root on 3/11/24.
//

#ifndef CLIENT_桌面_SERVE_DEVELOP_H_
#define CLIENT_桌面_SERVE_DEVELOP_H_
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sys/socket.h>
#include <iostream>

bool LISTEN(int &lfd);
int Bind(int _fd, const sockaddr *_addr, socklen_t _len);
int Socket(int _domain, int _type, int _protocol);
int err_exit(const char *Error);
int Listen(int sockfd, int backlog);
bool ACCEPT(const int &lfd, int &cfd, sockaddr_in &Caddr);

#endif //CLIENT_桌面_SERVE_DEVELOP_H_
//
// Created by root on 3/11/24.
//

#include "Develop.h"


int Listen(int sockfd, int backlog) {
  int n = listen(sockfd, backlog);
  if (n < 0)
    err_exit("Listen error ");
  return n;
}

int err_exit(const char *Error) {
  std::cerr << Error << strerror(errno) << std::endl;
  exit(-1);
}

int Socket(int _domain, int _type, int _protocol) {
  int n = socket(_domain, _type, _protocol);
  if (n < 0)
    err_exit("Socket error");
  return n;
}

int Bind(int _fd, const sockaddr *_addr, socklen_t _len) {
  int n = bind(_fd, (struct sockaddr *) _addr, _len);
  if (n < 0)
    err_exit("Socket error");
  return n;
}

bool LISTEN(int &lfd) {
  if (lfd != -1) {
    std::cout << "has build lfd" << std::endl;
    return false;
  }
  lfd = Socket(AF_INET, SOCK_STREAM, 0);
  int optval = 1;
  if (setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
    perror("setsockopt failed");
    exit(1);
  }

  sockaddr_in Laddr{};
  Laddr.sin_family = AF_INET;
  Laddr.sin_port = htons(8888);
  Laddr.sin_addr.s_addr = htonl(INADDR_ANY);

  int ret = bind(lfd, (const sockaddr *) &Laddr, sizeof(Laddr));
  if (ret == -1) {
    err_exit("Bind error ");
  }
  Listen(lfd, 128);

  return true;
}

bool ACCEPT(const int &lfd, int &cfd, sockaddr_in &Caddr) {

  socklen_t Caddr_len = sizeof(Caddr);
  cfd = accept(lfd, (struct sockaddr *) &Caddr, &Caddr_len);
  if (cfd == -1) {
    std::cout << "accept error" << std::endl;
    return false;
  }
  char Cip[16];
  memset(Cip, 0x00, sizeof(Cip));
  inet_ntop(AF_INET, &Caddr.sin_addr, Cip, sizeof(Cip));
  std::cout << "已连接客户端,客户端IP:" << Cip << " 端口号:" << ntohs(Caddr.sin_port) << std::endl;

  return true;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

炎爆的土豆翔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值