Delimiter, этот парень смышленный, ему просто надо технику показать, дальше он сам пойдет. а ща он наврят ли поймет что и почему не правильно сделал. не мучай его :)))
> > Показываю > > > > char buf[0x300], buf2[0x5000]; > я бы не советовал тебе так делать > используй > char *buf,*buf2; > ..................... > buf=new char[0x300]; > buf2=new char[0x5000]; > > > int n = 0; > > SOCKET s; > > LPHOSTENT lpHostEntry; > > SOCKADDR_IN saServer; > > lpHostEntry = gethostbyname("wwwserver"); > > if(lpHostEntry == NULL) > > { > > return 0; > > } > > s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); > > if(s == INVALID_SOCKET) > > { > > return 0; > > } > > saServer.sin_family = AF_INET; > > saServer.sin_addr = > > *((LPIN_ADDR)*lpHostEntry->h_addr_list); > > saServer.sin_port = htons(80); > ... а где же bind > что должен испоkьзовать сокет со своей стороны или по > умолчанию .....:) > > > n = connect(s, (LPSOCKADDR)&saServer, > > sizeof(SOCKADDR_IN)); > > if(n == SOCKET_ERROR) > > { > > return 0; > > } > > sprintf(buf, "GET / HTTP/1.1\r\nHost: > > wwwserver\r\nUser-Agent: Mozillo/5.0\r\n\r\n"); > > UINT a = 0; > > UINT b = 0; > > b = 0; > > while(b < strlen(buf)) > > { > > a = send(s, (char *)(buf + b), strlen(buf) > > - b, NULL); > а посылать мона и не побайтно > > b += a; > > } ^^^^^^^^^^^^^^^^^^^^
тут вызывай сразу
send(s, buf, strlen(buf) + 1);
Delimiter прав, нет смысла посылать по байтово.
ты изначально создал сокет - Blocking, т.е. любая операция у тебя останавливает поток, пока не закончишь действие. т.е. тут пока твои данные не отправятся (вызывая send) ты не сможешь продолжить программу. так что будь спокоен.
> > n = recv(s, buf2, sizeof(buf2), NULL); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
а вот ту делай цикл, если тебе удобно или хочется все в один буфер, то делай так
char* data = buf2;
int nSize = 0x5000;
a = b =0;
while (nSize >0 && (a = recv(s, data, nSize)) != SOCKET_ERROR)
{
if (a == 0)
break;
data += a;
nSize -= (int)a;
}
сюда попадаем либо если все данные получили, либо буффер забит, либо ошибка при получении.
а цикл делаешь т.к. сервер сразу не пошлет тебе все данные. а если и пошлет, все равно ты их сразу не получишь, а получать будешь частично.
тут конечно :
closesocket(s);
delete [] buf1;
delete [] buf2;
если выделял как Delimiter говорил, а он правильно говорил, большую память лучше выделять динамически.
|