我是winsock2和网络的新手,但我不是C的新手。
我的目标是制作一个可以从一台计算机向另一台计算机发送和接收数据的程序。
基本上我想做这样的事情: 计算机一用计算机二初始化传输。计算机一确实知道计算机二的IP地址,但计算机二不知道计算机一的IP地址。换句话说,计算机2可以作为服务器,计算机也可以作为客户端。
我希望这个工作没有任何一个用户需要弄乱路由器设置,如转发端口。我的想法是制作类似HTTP服务器的东西。这是因为几乎所有路由器都可以查看定期发送和接收数据的网页,这是我的目标。就像我想要做的那样,在客户端尝试从服务器请求内容之前,服务器不知道客户端的IP地址。所以说,我知道我应该用HTTP建模我的程序。我决定先写一个简单的程序来测试程序发送网页的能力。
#include <Winsock2.h>
#include <windows.h>
#include <stdio.h>
static const char html[]="HTTP/1.1 200 OK\r\n"
"Connection: close\r\n"
"Content-type: text/html\r\n\r\n"
"<html>\r\n"
"<head>\r\n"
"<title>Html Test</title>\r\n"
"</head>\r\n"
"<body>\r\n";
static const char htmlend[]="</body>\r\n"
"</html>\r\n\r\n";
static const char * defaultStr="Default";
int main(void){
int exit=0;
WSADATA wsa;
char buffer[512];
int bytes;
SOCKET s,client;
SOCKADDR_IN localAddress;
WSAStartup(MAKEWORD(2,2),&wsa);
while(!exit){
char * str;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
localAddress.sin_family = AF_INET;
localAddress.sin_port = htons(80);
localAddress.sin_addr.s_addr = INADDR_ANY;
bind(s, (SOCKADDR*)&localAddress, sizeof(localAddress));
listen(s, SOMAXCONN);
client = accept(s,NULL,NULL);
closesocket(s);
bytes = recv(client,buffer,512,0);
fputs(buffer,stdout);
str=strstr(buffer,"GET /")+5;
if(str){
char *str3;
if(*str==' '){
str=(char*)defaultStr;
}else{
char *str2=strstr(str," ");
*str2=0;
if(!strcmp(str,"Exit"))
exit=1;
}
puts(str);
str3=malloc(strlen(html)+strlen(htmlend)+strlen(str)+6);
strcpy(str3,html);
strcat(str3,str);
strcat(str3,"\r\n");
strcat(str3,htmlend);
fputs(str3,stdout);
send(client,str3,strlen(str3),0);
free(str3);
}
shutdown(client,SD_BOTH);
closesocket(client);
}
WSACleanup();
return 0;
}
上述程序的问题在于它仅适用于内部网络。当我尝试在万维网上访问它时,没有任何反应。我甚至采取了正确的方法(为P2P模拟http?)?我的程序有什么问题,它在万维网上不起作用?如果有人对这些问题中的任何一个或两个都有答案,我会先谢谢你。