hebinq
deepin
2018-01-03 20:06 /****************************************
* 功能:获取网页返回(socket)
* url:地址 不包含http://
*
* *************************************/
char* geturl(char* url)
{
char *g_result = NULL;
unsigned int g_buffersize = BUFSIZE;
int cfd;
struct sockaddr_in cadd;
struct hostent *pURL = NULL;
char myurl[BUFSIZE];
char *pHost = 0;
char host[BUFSIZE],GET[BUFSIZE];
char request[BUFSIZE];
static char text[BUFSIZE];
int i,j;
//分离主机中的主机地址和相对路径
memset(myurl,0,BUFSIZE);
memset(host,0,BUFSIZE);
memset(GET,0,BUFSIZE);
strcpy(myurl,url);
for(pHost = myurl;*pHost != '/' && *pHost != '\0';++pHost);
//获取相对路径保存到GET中
if((int)(pHost-myurl) == strlen(myurl))
{
strcpy(GET,"/");//即url中没有给出相对路径,需要自己手动的在url尾部加上/
}
else
{
strcpy(GET,pHost);//地址段pHost到strlen(myurl)保存的是相对路径
}
//将主机信息保存到host中
//此处将它置零,即它所指向的内容里面已经分离出了相对路径,剩下的为host信
//息(从myurl到pHost地址段存放的是HOST)
*pHost = '\0';
strcpy(host,myurl);
//设置socket参数
if(-1 == (cfd = socket(AF_INET,SOCK_STREAM,0)))
{
printf("create socket failed of client!\n");
return NULL;
}
pURL = gethostbyname(host);//将上面获得的主机信息通过域名解析函数获得域>名信息
//设置IP地址结构
bzero(&cadd,sizeof(struct sockaddr_in));
cadd.sin_family = AF_INET;
cadd.sin_addr.s_addr = *((unsigned long*)pURL->h_addr_list[0]);
cadd.sin_port = htons(80);
//向WEB服务器发送URL信息
memset(request,0,BUFSIZE);
strcat(request,"GET ");
strcat(request,GET);
strcat(request," HTTP/1.1\r\n");//至此为http请求行的信息
strcat(request,"HOST: ");
strcat(request,host);
strcat(request,"\r\n");
strcat(request,"Cache-Control: no-cache\r\n\r\n");
//连接服务器
int cc;
if(-1 == (cc = connect(cfd,(struct sockaddr*)&cadd,(socklen_t)sizeof(cadd))))
{
printf("connect failed of client!\n");
return NULL;
}
//printf("connect success!\n");
//向服务器发送url请求的request
int cs;
if(-1 == (cs = send(cfd,request,strlen(request),0)))
{
printf("向服务器发送请求的request失败!\n");
return NULL;
}
//printf("发送成功,发送的字节数:%d\n",cs);
//客户端接收服务器的返回信息
int cr=1;
//空间准备
if (g_result)
{
free(g_result);
}
g_result = (char*)malloc(BUFSIZE);
g_buffersize = BUFSIZE;
memset(g_result, 0, g_buffersize);
while(cr)
{
memset(text,0,BUFSIZE);
int buflen = recv(cfd, text, BUFSIZE, 0);
//printf("接收recv()->return:%d;字节数:%d\n",buflen,strlen(text));
if(buflen < 0)
{
// 由于是非阻塞的模式,所以当buflen为EAGAIN时,表示当前缓冲区已无数据可读
// 在这里就当作是该次事件已处理
//如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR
//recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0
if(buflen == EAGAIN)
break;
else
return NULL;
}
else if(buflen == 0)
{
// 这里表示对端的socket已正常关闭.
break;
}
if(buflen != strlen(text))
cr = 0;
else
cr = 1;// 需要再次读取
//写入结果
size_t left = g_buffersize - strlen(g_result);
size_t size = strlen(text);
if (left < size) {
g_result = (char*)realloc(g_result, g_buffersize + BUFSIZE);
if (g_result)
g_buffersize += BUFSIZE;
else {
printf("mem alloc failed\n");
return NULL;
}
}
strncat(g_result, text, size);
break;//读取一次就可以啦。。。
}
close(cfd);
return g_result;
}
Reply Like 0 View the author


中文 

还有代码:
/********************************************************
* gcc -lpthread -o curl ./curl.c
*
* ./curl sh600133
*
* hebinq@qq.com
*
*
* *******************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFSIZE 0xF000
//股票数据
typedef struct _GPDATA_SL{
char dm[16];//代码
char mc[16];//名字
float jrkpj;//今日开盘价
float zrspj;//昨日收盘价
float zxj;//最新价
float jrzjj;//今日最高价
float jrzdj;//今日最低价
float jmji;//竞买价
float jmjo;//竞买价
int cjgps;//成交的股数(股) 腾讯手
double cjje;//成交金额(元) 腾讯万
int mi_1;//买1股
float mij_1;//买1价
int mi_2;//买2股
float mij_2;//买2价
int mi_3;//买3股
float mij_3;//买3价
int mi_4;//买4股
float mij_4;//买4价
int mi_5;//买5股
float mij_5;//买5价
int mo_1;//卖1股
float moj_1;//卖1价
int mo_2;//卖2股
float moj_2;//卖2价
int mo_3;//卖3股
float moj_3;//卖3价
int mo_4;//卖4股
float moj_4;//卖4价
int mo_5;//卖5股
float moj_5;//卖5价
char rq[16];//日期
char sj[16];//时间
int wp;//外盘
int np;//内盘
float zd;//涨跌
float zf;//涨幅
float hsl;//换手率
float xyl;// 市盈率
float sf;//振幅
float ltsz;//流通市值
float zsz;//总市值
float szl;//市净率
float ztj;//涨停价
float dtj;//跌停价
float lb;//量比
float xylz;//市盈率(静)
}GPDATA_SL;