IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> C++开发服务器2 -> 正文阅读

[系统运维]C++开发服务器2

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

内容


服务器升级版,获取linux qt客户端传来的信息,并拆包和分别打印出来账号密码。并发包给客户端
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

typedef struct head
{
int fun; //定义数据包头
int dataLength; //描述数据长度
}HEAD_T;
typedef struct user //定义用户数据包体
{
char UserName[32];
char PassWord[32];
}USER_T;

typedef struct ret //定义服务器应答包体
{
int flag; //定义用户登录返回状态
char name[32]; //返回用户名
}RET_T;

int main(int argc, char* argv[])
{
int socket_fd;
int ret;
char buff[1024];
char buffer[1024];
int lens;
int recv_len;
int sent_len;
unsigned char recv_buf[1000];
int client_num = -1;
socklen_t addr_len;
int new_fd;
signal(SIGCHLD, SIG_IGN);//防止僵尸进程产生
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
if (-1 == socket_fd)
{
fprintf(stderr, “socket error %s\n”, strerror(errno)); // rerror
exit(1);
}
int issockeopet = 1;
if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&issockeopet, sizeof(int)) < 0)//设置ip地址重复使用
{
close(socket_fd);
exit(1);
}
memset(&server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动接受任意IP地址

ret = bind(socket_fd, (struct sockaddr*)(&server_addr), sizeof(struct sockaddr));
if (ret == -1)
{
	fprintf(stderr, "bind error:%s\n", strerror(errno));
	exit(0);
}
if (listen(socket_fd, 10) == -1)
{
	fprintf(stderr, "listen error:%s\n", strerror(errno));
	exit(0);
}
//数据包定义

char BackData[128] = { 0 };

HEAD_T* read_head = (HEAD_T*)malloc(sizeof(HEAD_T));				//用户数据包头
USER_T* read_user = (USER_T*)malloc(sizeof(USER_T));				//用户数据包体
HEAD_T* ret_head = (HEAD_T*)malloc(sizeof(HEAD_T));					//服务应答数据包头
RET_T* ret_info = (RET_T*)malloc(sizeof(RET_T));

/* accept */
while (1)
{
	addr_len = sizeof(struct sockaddr);
	new_fd = accept(socket_fd, (struct sockaddr*)&client_addr, &addr_len);
	if (-1 == new_fd)
	{
		fprintf(stderr, "accept error:%s\n\a", strerror(errno));
		close(socket_fd);
		exit(1);
	}

	client_num++;
	fprintf(stderr, "Server get connetion form client%d: %s\n", client_num, inet_ntoa(client_addr.sin_addr));

	if (!fork())
	{
		/* Child process */
		printf("hello world!");
		while (1)
		{
			/* recv */
			recv_len = recv(new_fd, recv_buf, 1024, 0);
			printf("%d", recv_len);
			if (recv_len <= 0)
			{
				fprintf(stderr, "recv error:%s\n\a", strerror(errno));
				close(new_fd);
				exit(1);
			}
			else
			{
				memcpy(read_head, recv_buf, sizeof(HEAD_T));
				memcpy(read_user, recv_buf + sizeof(HEAD_T), sizeof(USER_T));
				printf("nbytes is %d\n", recv_len);
				printf("fun is %d\n", read_head->fun);
				printf("UserName is %s \nPassWord is %s\n", read_user->UserName, read_user->PassWord);
				memset(read_head, 0, sizeof(read_head));
				//if (strcmp(read_user->UserName, "admin") == 0 and strcmp(read_user->PassWord, "123456") == 0)
				//{
				//	ret_info->flag = 1;//1表示登录成功
				//	strcpy(ret_info->name, read_user->UserName);
				//	ret_head->dataLength = 0;
				//	ret_head->fun = 1;
				//	memset(buffer, 0, 1024);
				//	memcpy(buffer, &ret_head, sizeof(HEAD_T));
				//	memcpy(buffer + sizeof(RET_T), &ret_info, sizeof(USER_T));
				//	int nbytes = ::write(new_fd, buffer, sizeof(RET_T)+ sizeof(USER_T));
				//}
			}
		}
		close(new_fd);
	}
}
/* close */
close(socket_fd);
exit(0);
return 0;

}
客户端qt处理数据发包
char buffer[1024];
HEAD_T login_head;
USER_T login_data;
login_head.fun=LOGIN_IN;
login_head.dataLength=sizeof(HEAD_T)+sizeof(USER_T);
strcpy(login_data.UserName,ui->lineEdit->text().toStdString().c_str());
strcpy(login_data.PassWord,ui->lineEdit_2->text().toStdString().c_str());
memset(buffer,0,1024);
memcpy(buffer,&login_head,sizeof(HEAD_T));
memcpy(buffer+sizeof(HEAD_T),&login_data,sizeof(USER_T));
int nbytes=::write(settingWin::sock_fd,buffer,sizeof(HEAD_T)+sizeof(USER_T));
qDebug()<<nbytes<<endl;
qDebug()<<“socket is %d”<<settingWin::sock_fd<<endl;

总结

提示:这里对文章进行总结:
本次我用开启第二个线程的办法进行操作,之后会改成进程后期变成线程池

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 13:16:28  更:2021-12-13 13:17:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:38:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码