#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h> //包含网络编程头文件
#pragma comment(lib,"ws2_32.lib") //静态库
void sendhtml(SOCKET s, char* filename);
int merror(int redata,int error,char*showinfo)
{
if (redata == WSAEINVAL) //判断是否分配成功
{
perror(showinfo);
getchar();
return -1;
}
return 0;
}
int main()
{
printf("欢迎使用Web服务器----");
WSADATA wsdata; //结构体,厂家名,socket地址类型
int isok=WSAStartup(MAKEWORD(2,2),&wsdata); //确定socket版本信息
//short 2B
merror(isok, WSAEINVAL, "申请socket失败");
SOCKET server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //IPv4地址 手机
merror(server, INVALID_SOCKET, "创建socket失败");
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET; //和创建的时候必须一样 ipv4
seraddr.sin_port = htons(80); //端口
seraddr.sin_addr.s_addr = htons(INADDR_ANY); //监听任意地址
isok=bind(server,&seraddr,sizeof(seraddr));
merror(isok, SOCKET_ERROR, "绑定失败...\n");
isok= listen(server, 5);
merror(isok, SOCKET_ERROR, "监听失败...\n");
struct sockaddr_in claddr; //接收客户端信息
int cllen = sizeof(claddr);
while (1) //一直等
{
SOCKET client = accept(server, &claddr, &cllen); //谁连进来了
merror(client, INVALID_SOCKET, "连接失败...\n");
char revdata[1024] = "";
recv(client, revdata, 1024, 0);
printf("%s 共接收到%d字节数据\n",revdata,strlen(revdata));
char sendata[1024] = "<h1 style=\"color:red;\">你好,我是服务器!<\h1>";
send(client, sendata, strlen(sendata), 0);
//char* filename = "./屏幕截图 2021-06-16 192010.png";
//sendhtml(client,filename);
closesocket(client);
}
closesocket(server);
WSACleanup();
return 0;
}
void sendhtml(SOCKET s, char* filename)
{
FILE* pfile = fopen(filename, "rb");
if (pfile == NULL)
{
printf("打开文件失败\n");
return;
}
char temp[1024] = "";
do
{
fgets(temp, 1024, pfile);
send(s, temp, strlen(temp), 0);
} while (!feof(pfile));
}
参考GPT和自己的思路:
首先需要明确的是,端口号并非限定了浏览器访问该网站的唯一条件,只是为了方便用户记忆和使用而规定了默认端口号。实际上,只要在浏览器输入对应网站的IP地址和端口号,就可以访问该网站。
在这个问题中,服务器使用了端口号80来监听客户端的连接请求,如果需要使用其他的端口号,只需要修改如下代码:
seraddr.sin_port = htons(端口号);
例如,如果想要使用端口号8888,可以修改为:
seraddr.sin_port = htons(8888);
然后在浏览器中访问对应的IP地址和端口号即可。注意,如果使用了非80端口号,需要在浏览器中显示地指定端口号,例如:
http://192.168.0.101:8888/
其中,192.168.0.101为服务器的IP地址,8888为端口号。