64,654
社区成员
发帖
与我相关
我的任务
分享
int socket_open(int IP,int Port,int type)
{
WSADATA Ws;
SOCKET socketId;
struct sockaddr_in serv_addr;
int status;
if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
{
cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
return -1;
}
socketId=socket(AF_INET,SOCK_STREAM,0);
if (socketId == INVALID_SOCKET )
return -1;
/*if((int)socketId<0)
{
printf("[ERROR]Create a socket failed!/n");
return -1;
}*/
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = ntohl(IP);
serv_addr.sin_port = htons((USHORT)Port);
status = connect(socketId,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
if(status != 0)
{
printf("[ERROR]Connecting failed!/n");
closesocket(socketId);
return -1;
}
return socketId;
}
char *GetprotocolHead(string url, string host)
{
static string protocolHead = "GET "+ url;
protocolHead += " HTTP/1.1\r\n";
protocolHead += "Accept: html/text\r\n";
protocolHead += "Accept-Language: zh-cn\r\n";
protocolHead += "Host: ";
protocolHead += host;
protocolHead += ":80\r\n";
protocolHead += "Connection: close\r\n";
protocolHead += "\r\n";
char *char_protocolHead = const_cast<char*>(protocolHead.c_str()); //protocolHead.c_str();
return char_protocolHead;
}
int main()
{ //61.135.169.125:0x3D87A97D百度
//0x0A011E2A是10.1.30.42,百度119.75.217.109:0x774BD96D
int socketId=socket_open(0x3D87A979,80,0); //0xC0A80001是192.168.0.1的十六进制写法。
string url = "http://www.baidu.com/index.html";
string host = "www.baidu.com";
char *protocolHead;
protocolHead = GetprotocolHead(url, host);
send(socketId, protocolHead,strlen(protocolHead),0);
char recvBuf[8192]="/0"; //接收数据缓存4096
fd_set fdSocket; // 所有可用套节字集合
//FD_ZERO(&fdSocket);
//FD_SET(socketId, &fdSocket);
struct timeval timeout={2,0}; // 设置超时
while(true)
{
//char recvBuf[4096]="/0";
FD_ZERO(&fdSocket);
FD_SET(socketId, &fdSocket);
//fd_set fdRead = fdSocket;
int res_select;
res_select = select(0, &fdSocket, NULL, NULL, &timeout);
switch(res_select)
{
case 0 :
printf("time out!\n");
return -1;
//break;
case -1:
printf("select error!\n");
return -1;
//break;
default:
if (FD_ISSET(socketId,&fdSocket))
{
int receive = recv(socketId,recvBuf,8192,0);
if (receive == 0 || (receive == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))
{
//closesocket(socketId);
printf("socket close!\n");
break;
}
}
}
}