#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;
}