64,646
社区成员
发帖
与我相关
我的任务
分享
#include <winsock2.h>
#include <stdio.h>
int main()
{
char packet[]="GET /btc/search/1BTCoinWDVhwD5Nov86QTMYvdjZ69Ho6mi/ HTTP/1.1\r\n"
"Host: block.okcoin.cn\r\n"
"Connection: close\r\n"
"Accept: text\r\n"
"User-Agent: Mozilla/5.0\r\n\r\n";
char revData[1024]={0};
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0) return 0;
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
struct sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(80);
servAddr.sin_addr.S_un.S_addr =inet_addr("121.199.251.136");
if(connect(sClient,(struct sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
send(sClient,packet,strlen(packet),0);
while(recv(sClient,revData,BUFSIZ,0)>0){
printf("%s",revData);
memset(revData,0,1024);
}
closesocket(sClient);
WSACleanup();
return 0;
}
#include <winsock2.h>
#include <stdio.h>
int main()
{
char address[]= "1BTCoinWDVhwD5Nov86QTMYvdjZ69Ho6mi";
char packet[256],revData[BUFSIZ]={0};
sprintf(packet,"GET /btc/search/%s/ HTTP/1.1\r\n"
"Host: block.okcoin.cn\r\n"
"Connection: close\r\n"
"User-Agent: Mozilla/5.0\r\n\r\n",address);
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0) return 0;
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
struct sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(80);
servAddr.sin_addr.S_un.S_addr =inet_addr("121.199.251.136");
if(connect(sClient,(struct sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
send(sClient,packet,strlen(packet),0);
while(recv(sClient,revData,BUFSIZ,0)>0){
printf("%s",revData);
memset(revData,0,BUFSIZ);
}
closesocket(sClient);
WSACleanup();
return 0;
}
while(recv(sClient,revData,sizeof(revData)-1,0)>0){
printf("%s",revData);
搜索revData关键字符
memset(revData,0,1024);
}
我这么写 是不是 不严谨啊
因为 我觉得 假如 我要搜索的 关键字符串 正好 处在 1023-1026 那使用这样不完全接收完数据就搜索 是不是有搜索不到的可能啊[/quote]
如果要接收完整再搜索关键字,避免你说的关键字卡在2处的方法
用个string,每次接收了一个缓冲区的内容,string.append(buff, buff+recvsize)
最后在string搜索 while(recv(sClient,revData,sizeof(revData)-1,0)>0){
printf("%s",revData);
搜索revData关键字符
memset(revData,0,1024);
}
我这么写 是不是 不严谨啊
因为 我觉得 假如 我要搜索的 关键字符串 正好 处在 1023-1026 那使用这样不完全接收完数据就搜索 是不是有搜索不到的可能啊[/quote]
我感觉效率都一样的。放在外面可以避免超出revData数组范围。 while(recv(sClient,revData,sizeof(revData)-1,0)>0){
printf("%s",revData);
搜索revData关键字符
memset(revData,0,1024);
}
我这么写 是不是 不严谨啊
因为 我觉得 假如 我要搜索的 关键字符串 正好 处在 1023-1026 那使用这样不完全接收完数据就搜索 是不是有搜索不到的可能啊 int a;
while(a=recv(sClient,revData,sizeof(revData)-1,0)){ //可在这里如果 直接使用revData的数组大小1024 不减1 结果和减1 是同样的结果
revData[a]=0; //revData的大小 不就是有多大 每次接收的数据就有多少吗 如果不减1 那每次接收1024装满了,最后并没有0
printf("%s",revData); //假如 revData【1024】装满了 那用revData[a]=0; 设置最后一位 不是把最后一位正常数据设置0了,为什么还能打印出正常结果啊 是不是网页源代码很多空格 覆盖的是空格 没覆盖到有效字符
//memset(revData,0,1024);
}
这里应该使用 revData[a]=0;还是 revData[a+1]=0;
#include <winsock2.h>
#include <stdio.h>
int main()
{
char packet[]="GET /btc/search/1BTCoinWDVhwD5Nov86QTMYvdjZ69Ho6mi/ HTTP/1.1\r\n"
"Host: block.okcoin.cn\r\n"
"Connection: keep-alive\r\n"
"User-Agent: Mozilla/5.0\r\n\r\n";
char revData[1024]={0};
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0) return 0;
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(80);
servAddr.sin_addr.S_un.S_addr =inet_addr("121.199.251.136");
if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
send(sClient,packet,strlen(packet),0);
while(recv(sClient,revData,1024,0)>0){ //此处修改正确后 (1024) 程序运行结果反正不对了(以前用BUFSIZ时反而能输出正确结果)
printf("%s",revData);
memset(revData,0,1024);
}
closesocket(sClient);
WSACleanup();
return 0;
}
这样运行 就和代码2输出结果一样了 都是夹杂着 send数据的
反而第一次贴的代码1 使用的 while(recv(sClient,revData,BUFSIZ,0)>0) 虽然用BUFSIZ(512) 比revData实际长度小 但结果是正确的
现在问题变成了 完全是代码2的问题了
代码2 得到的结果参杂 send的内容
void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545