c语言使用socket编程模拟服务器发送HTML代码给浏览器显示再网页上

本文主要是介绍c语言使用socket编程模拟服务器发送HTML代码给浏览器显示再网页上,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是一个通过socket编程实现的一个模拟http服务器,在服务器接收到浏览器的连接后,发送一个HTML网页过去,然后在浏览器上显示出来;

/*实现通过tcp/ip协议实现当服务器接收到浏览器请求后,发送一段HTML网页给浏览器
*/
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>//初始化地址端口及开启服务器等待连接
int init_net()
{//创建套接字int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd < 0){perror("socket failed");return -1;}//======================设置地址复用====================================int on=1;int rret = setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));//=====================================================================//=======================绑定套接字=====================================struct sockaddr_in my_addr;memset(&my_addr,0,sizeof(my_addr));my_addr.sin_family = AF_INET;//使用的协议:ipv4my_addr.sin_port = htons(9988);//绑定的端口号my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定任意地址int ret = bind(socketfd,(struct sockaddr *)&my_addr,sizeof(my_addr));if(ret < 0){perror("bind failed");close(socketfd);return -1;}//=======================================================================//=======================监听套接字=======================================ret = listen(socketfd,5);if(ret == -1){perror("listen failed");close(socketfd);return -1;}//========================================================================//初始化完毕,返回套接字return socketfd;
}//线程函数,用于每个客户端连接后创建一个线程进行调用
void *func(void *arg)
{//================先发送头部信息,再打开本地文件读取发送=======================int acceptfd = *(int *)arg;//把传递的参数强转为int类型////	tcp服务器响应头部信息://		HTTP:使用http 1.1协议//		Accept-Ranges:范围请求的单位是 bytes (字节)//		Content-Length:内容长度//		Connection:短连接//		最后必须加上\r\n(格式要求)//char head_buf[] = "HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\n\Content-Length: 1024\r\n\Content-Type: text/html;charset=UTF-8\r\n\Connection: close\r\n\r\n";int ret = send(acceptfd,head_buf,strlen(head_buf),0);if(ret == -1){perror("send failed");close(acceptfd);return NULL;}//============================================================================//网页正文代码,在网页打印一个“text”/*char text_buf[] = "<!DOCTYPE html>\n\
<html>\n\
<head></head>\n\
<body>test</body>\n\
</html>";*////html网页代码编码格式///		http-equiv:设置指定页面使用的编码集///	<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\char text_buf[] = "<!DOCTYPE html>\n\
<html>\r\n\
<head>\r\n\
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\
<script>\r\n\
function checkForm()\r\n\
{\r\n\
alert(\"表单已提交!\");\r\n\
}\r\n\
</script>\r\n\
</head>\r\n\
<body>\r\n\
<form action=\"open\" οnsubmit=\"checkForm()\">\r\n\
<label type=\"text\" value=\"开灯\">\r\n\
<input type=\"submit\" value=\"开灯\">\r\n\
</form>\r\n\
<form action=\"close\" οnsubmit=\"checkForm()\">\r\n\
<label type=\"text\" value=\"关灯\">\r\n\
<input type=\"submit\" value=\"关灯\">\r\n\
</form>\r\n\
</body>\r\n\
</html>";ret = send(acceptfd,text_buf,strlen(text_buf),0);if(ret < 0){perror("text write failed");}//如果关闭套接字则会导致浏览器发送多次命令后无法再次发送数据//close(acceptfd);//线程退出pthread_exit(NULL);
}//主函数入口
int main(int argc,char **argv)
{	//初始化int socketfd = init_net();while(1){struct sockaddr_in addr;//保存客户端ip,端口等信息的结构体socklen_t len = sizeof(addr);//保持多少个字节//阻塞等待客户端开始连接int acceptfd = accept(socketfd,(struct sockaddr*)&addr,&len);if(acceptfd == -1){perror("acceptfd failed");close(acceptfd);return -1;}//当有连接时,打印连接的客户端ip号char *ip = inet_ntoa(addr.sin_addr);printf("\n\n\n有客户端连接:%s\n",ip);//创建线程让其工作pthread_t pid = -1;int ret = pthread_create(&pid,NULL,func,&acceptfd);if(ret != 0){printf("pthread_create failed\n");continue;}//线程分离pthread_detach(pid);}return 0;	
}
主要问题:个人仅在局域网内测试过,未在公网上测试(有服务器的可以在公网上测试下是否可行);而且速度有点慢,有想过这个问题但是没有思路,加上有其他事要忙就只能先放到一边

这篇关于c语言使用socket编程模拟服务器发送HTML代码给浏览器显示再网页上的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/798530

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地