C语言实现简单web服务器端口不为80,浏览器就不能访问

#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为端口号。