Официальный сайт студ.городка НГТУ
Программирование и БД » [C++] winsock 2.0 Проблемы реализации 

#1  27.12.11 00:02

[C++] winsock 2.0 Проблемы реализации

Код::

#include <stdio.h>
#include "StdAfx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")


int main( int argc, char **argv )
{
  WSADATA wsaData;
  WORD wVersionRequested;
  wVersionRequested = MAKEWORD(2, 0);
  WSAStartup (wVersionRequested, &wsaData);

  if ( WSAStartup (wVersionRequested, &wsaData) < 0)
  {
	  printf("Version error!");
	  exit(1);
  }

SOCKET MySocket;
MySock = socket(AF_INET, SOCK_STREAM, 0);
MySock = socket(AF_INET, SOCK_DGRAM, 0);
struct hostent *target_ptr;
target_ptr = gethostbyname( targetip);

if(target_ptr = gethostbyname( targetip) == NULL )
{
	printf("Can't resolve name.");
	exit(1);
}

struct sockaddr_in sock;
memcpy(&sock.sin_addr.s_addr,target_ptr->h_addr,target_ptr->h_length);
sock.sin_family = AF_INET;
sock.sin_port = htons ( port );
connect (MySock, (struct sockaddr *)&sock, sizeof (sock) );

if (connect (MySock, (struct sockaddr *)&sock, sizeof (sock) ) )
{
	printf("Can't established connect.");
	exit(1);
}

char *recv_string = new char [MAX];
int nret = 0;
nret = recv( MySock, recv_string, MAX, 0);

if ((nret = recv( MySock, recv_string, MAX, 0)) <= 0 )
{
	printf("Not data.");
	exit(1);
}

char send_string [ ] = "\n\r Hello World \n\r\n\r";
int nret = 0;
nret = send( MySock, send_string, sizeof( send_string) -1, 0 );
if ( (nret = send( MySock, send_string, sizeof( send_string) -1, 0 )) <= 0 )
{
	printf("Can't send a data.");
	exit(1);
}


socketaddr_in serverInfo;
serverInfo.sin_family = AF_INET;
serverInfo.sin_addr.s_addr = INADDR_ANY;
listen(MySock, 10);
SOCKET NewSock;

NewSock = accept(MySock, NULL, NULL);
closesocket(MySock);
WSACleanup();


}

Вообщем, вроде как все правильно... Но что-то вылезает с необявленными идентификаторами... Вот полный листинг ошибок компилятора:

Sock.cpp(21): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(22): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(24): error C2065: targetip: необъявленный идентификатор
1>Sock.cpp(26): error C2065: targetip: необъявленный идентификатор
1>Sock.cpp(35): error C2065: port: необъявленный идентификатор
1>Sock.cpp(36): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(38): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(44): error C2065: MAX: необъявленный идентификатор
1>Sock.cpp(46): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(46): error C2065: MAX: необъявленный идентификатор
1>Sock.cpp(48): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(48): error C2065: MAX: необъявленный идентификатор
1>Sock.cpp(55): error C2374: nret: переопределение; множественная инициализация
1>          Sock.cpp(45): см. объявление "nret"
1>Sock.cpp(56): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(57): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(64): error C2065: socketaddr_in: необъявленный идентификатор
1>Sock.cpp(64): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "serverInfo"
1>Sock.cpp(64): error C2065: serverInfo: необъявленный идентификатор
1>Sock.cpp(65): error C2065: serverInfo: необъявленный идентификатор
1>Sock.cpp(65): error C2228: выражение слева от ".sin_family" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>Sock.cpp(66): error C2065: serverInfo: необъявленный идентификатор
1>Sock.cpp(66): error C2228: выражение слева от ".sin_addr" должно представлять класс, структуру или объединение
1>          тип: 'unknown-type'
1>Sock.cpp(66): error C2228: выражение слева от ".S_un" должно представлять класс, структуру или объединение
1>Sock.cpp(66): error C2228: выражение слева от ".S_addr" должно представлять класс, структуру или объединение
1>Sock.cpp(67): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(70): error C2065: MySock: необъявленный идентификатор
1>Sock.cpp(71): error C2065: MySock: необъявленный идентификатор

Подскажите, что не так.... Только по теме плиз :)

Offline

#2  27.12.11 10:32

Re: [C++] winsock 2.0 Проблемы реализации

Не троллишь случайно?

А по теме у тебя в коде нет объявления как минимум 5ти переменных. Копипаст не проканал :)
Пользуйся доверенными источниками, MSDN, к примеру. Вот, для примера

Исправлено [PAUL] (27.12.11 10:32)

Offline

#3  27.12.11 14:10

Re: [C++] winsock 2.0 Проблемы реализации

[PAUL] написал(а):

Копипаст не проканал :)

Не я вручную набирал... это с книжки. Просто там такая книга, что там написан только участок кода, а все остальное надо дописывать самому... Ну вот я и попытался сам дописать :) Чет не поперло... Жаль, вот линк твой не могу посмотреть (внешки нет)... Вообщем надо покопаться в идентификаторах...мб, чо нибудь накопаю

Offline

#4  27.12.11 15:18

Re: [C++] winsock 2.0 Проблемы реализации

Sock.cpp(21): error C2065: MySock: необъявленный идентификатор

в коде идет объявление переменной MySocket, но в следующей строчке она превращается в MySock..

Sock.cpp(24): error C2065: targetip: необъявленный идентификатор

объявить переменную targetip и засунуть в нее хостнэйм.

Sock.cpp(35): error C2065: port: необъявленный идентификатор

аналогично. бъявить переменную port и засунуть в нее номер порта.

Sock.cpp(44): error C2065: MAX: необъявленный идентификатор

объявить MAX константой и засунуть туда большую чиселку.

Sock.cpp(55): error C2374: nret: переопределение; множественная инициализация
Sock.cpp(45): см. объявление "nret"

nret объявлена два раза. второе объявление удалить.

Sock.cpp(64): error C2065: socketaddr_in: необъявленный идентификатор

скорее всего структура должна называться sockaddr_in.

Offline

#5  27.12.11 22:32

Re: [C++] winsock 2.0 Проблемы реализации

Я совсем запутался... Все вроде сделал - получилось вполне похожее на клиентское TCP-приложение муть оО...

Решил выложить листинг:

Код: :

#include <stdio.h>
#include "StdAfx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
 
#define STRING_MAX 1024;
 
 
char *client_send( char *targetip, int port )
{
  double  MAX; 
  WSADATA wsaData;
  WORD wVersionRequested;
  SOCKET MySock;
  struct hostent pTarget;
  struct sockaddr_in sock;
 
  MAX=64000;
  wVersionRequested = MAKEWORD (2, 2);
  WSAStartup (wVersionRequested, &wsaData);
 
  if ( WSAStartup (wVersionRequested, &wsaData) < 0)
  {
	  printf("Version error!");
 
	  WSACleanup();
	  exit(1);
  }
 
MySock = socket(AF_INET, SOCK_STREAM, 0);
 
if (MySock == INVALID_SOCKET)
	{
		printf("Socket error!\r\n");
 
		closesocket(MySock);
		WSACleanup;
	    exit(1);
	}
 
 
if( (pTarget == gethostbyname(targetip)) == NULL )
{
	printf("Can't resolve name.");
 
	closesocket(MySock);
	WSACleanup;
	exit(1);
}
 
 
memcpy(&sock.sin_addr.s_addr,pTarget->h_addr,pTarget->h_length);
sock.sin_family = AF_INET;
sock.sin_port = htons ( port );
 
if (connect (MySock, (struct sockaddr *)&sock, sizeof (sock) ) )
{
	printf("Can't established connect.");
 
	closesocket(MySock);
	WSACleanup;
	exit(1);
}
 
char *recvString = new char [MAX];
int nret;
nret = recv( MySock, recvString, MAX +1, 0);
char *output = new char[nret];
strcpy(output,"");
 
if (nret == SOCKET_ERROR)
{
	printf("Can't send  data.");
 
}
 
else 
{
	strncat(output, recvString, nret);
	delete [ ] recvString;
}
 
 
 
closesocket(MySock);
WSACleanup();
return(output);
delete [ ] output;
 
}
 
 
int main(int argc, char *argv[])
{
	int port = 80;
	char* targetip;
 
	if(argc <2)
	{
		printf("ClientAPP usage:\r\n");
		printf("	%s <TargetIP> [port]\r\n", argv[0]);
		return(0);
	}
 
	targetip=argv[1];
	if (argc >= 3)
	{
		port=atoi(argv[2]);
	}
 
	printf("%s", client_send(targetip, port) );
	return 0;
}
 
 
 




Компилятор ругается по полной... ругается даже на сам  head-файл winsock2.h :)....

1>d:\coding\socket_prj\sock\sock\sock.cpp(40): error C2679: бинарный "=": не найден оператор, принимающий правый операнд типа "hostent *" (или приемлемое преобразование отсутствует)
1>          c:\program files\microsoft sdks\windows\v7.0a\include\winsock2.h(239): может быть "hostent &hostent::operator =(const hostent &)"
1>          при попытке сопоставить список аргументов "(hostent, hostent *)"
1>d:\coding\socket_prj\sock\sock\sock.cpp(45): warning C4551: в вызове функции отсутствует список аргументов
1>d:\coding\socket_prj\sock\sock\sock.cpp(50): error C2819: тип "hostent" не имеет перегруженный "operator ->"
1>          c:\program files\microsoft sdks\windows\v7.0a\include\winsock2.h(232): см. объявление "hostent"
1>          возможно, имеется в виду "."
1>d:\coding\socket_prj\sock\sock\sock.cpp(50): error C2232: ->hostent::h_addr_list: левый операнд имеет тип "struct", используйте "."
1>d:\coding\socket_prj\sock\sock\sock.cpp(50): error C2819: тип "hostent" не имеет перегруженный "operator ->"
1>          c:\program files\microsoft sdks\windows\v7.0a\include\winsock2.h(232): см. объявление "hostent"
1>          возможно, имеется в виду "."
1>d:\coding\socket_prj\sock\sock\sock.cpp(50): error C2232: ->hostent::h_length: левый операнд имеет тип "struct", используйте "."
1>d:\coding\socket_prj\sock\sock\sock.cpp(59): warning C4551: в вызове функции отсутствует список аргументов
1>d:\coding\socket_prj\sock\sock\sock.cpp(63): error C2143: синтаксическая ошибка: отсутствие ")" перед ";"
1>d:\coding\socket_prj\sock\sock\sock.cpp(63): error C2143: синтаксическая ошибка: отсутствие "]" перед ")"
1>d:\coding\socket_prj\sock\sock\sock.cpp(63): error C2059: синтаксическая ошибка: )
1>d:\coding\socket_prj\sock\sock\sock.cpp(63): error C2143: синтаксическая ошибка: отсутствие ";" перед "]"
1>d:\coding\socket_prj\sock\sock\sock.cpp(65): error C2143: синтаксическая ошибка: отсутствие ")" перед ";"
1>d:\coding\socket_prj\sock\sock\sock.cpp(65): error C2660: recv: функция не принимает 3 аргументов
1>d:\coding\socket_prj\sock\sock\sock.cpp(65): error C2059: синтаксическая ошибка: )

Комментарии к листингу прочитал на 10 раз... Понял только одно - переводчик походу сам программист и поэтому мягко говоря выражает свое недовольство кодом автора:)) Причем привел бы хоть свой код, а то просто говорит мол все фигня и работать корректно не будет... Там buffer overflow, тут некорректный размер массива... Вообщем веселуха в книжке полнейшая :))

Offline

#6  27.12.11 22:32

sav
Профиль

Re: [C++] winsock 2.0 Проблемы реализации

а разве IDE в котором ты текст набираешь не подсказывает и не предлагает названия корректные и уже объявленные?

Offline

#7  27.12.11 22:35

Re: [C++] winsock 2.0 Проблемы реализации

sav,  нет он только выделяет, что по его мнению некорректно... Но у меня в листинге все (по мнению среды VC++) норм

Offline

#8  27.12.11 23:06

Re: [C++] winsock 2.0 Проблемы реализации

Wanseg, может стоит начать с hello world ?

Offline

#9  27.12.11 23:16

Re: [C++] winsock 2.0 Проблемы реализации

#include <iostream.h>


int main()

{
cout<<"Hello, world!";
system("pause");
return 0;
/*Problem?*/
}


П.С. Я не просил указывать с чего мне стоит начать, как-нибудь сам разберусь... Я просил помочь в решении моей проблемы! Если нечего написать, то не пишите вообще!

Offline

#10  28.12.11 00:37

Re: [C++] winsock 2.0 Проблемы реализации

яхз, компилятор ругаецца русским по белому, даже думать толком не надо >_<

зы, ну и объявление вещественной переменной для длины строки - это сурово. тем более когда есть вышеобъявленная константа, как раз для такого случая.
ззы, если компилятор пишет, что hostent - это структурка и обращение должно быть через . а не ->, мб стоит к нему прислушаться.

Исправлено dorido (28.12.11 00:38)

Offline

#11  28.12.11 14:41

Re: [C++] winsock 2.0 Проблемы реализации

А что за книга такая, по который ты пишешь? Суть в том, что компилятор выдает вполне адекватные ошибки, и, даже более, если кликнуть по строке в логе, он перейдет на место, где допущена ошибка. Я так понял первый раз со студией работаешь? До этого писал программы на каком-то языке? Не пойми меня неправильно, я пытаюсь понять, на каком уровне тебе объяснять основы работы со студией, поскольку когда на втором курсе первый раз запустил студию после Borland C++ 3.11, сам в @#уе был :)

Offline

#12  28.12.11 18:03

sav
Профиль

Re: [C++] winsock 2.0 Проблемы реализации

[PAUL] написал(а):

поскольку когда на втором курсе первый раз запустил студию после Borland C++ 3.11, сам в @#уе был :)

Мы тут весной правили код, написанный на Борланде, начали дебажить.... были в легком шоке, как десять лет назад люди на нем работали:)))

Offline

#13  28.12.11 18:30

Re: [C++] winsock 2.0 Проблемы реализации

sav, ну да, я скажу так даже: после 5ти лет использования студии я попробовал помочь человеку с первого курса в Борланде 3.11 и понял, что жил я тогда неправильно :)

Offline

#14  28.12.11 18:36

Re: [C++] winsock 2.0 Проблемы реализации

[PAUL],   книга называется: "Сокеты, Shell код, эксплойты" Автор - Дж.Фостер(перевод конечно не очень). Со студией работаю впервые(раньше программировал на обычном консольном С++) Есть основы работы с классами и структурами. Решил изучить сокеты вот... Читаю книги, но пока все понимаю только в теории, а на практике не могу осуществить, так как нету опыта.

Offline

#15  28.12.11 18:51

Re: [C++] winsock 2.0 Проблемы реализации

Ну все ЧО :) Я исправил все... Ошибки правда глупые... Только вот теперь надо попробовать собственно использовать прогу... Она должно прочитать веб-страницу с сервера...

правда вот переводчик(по ходу тоже программист) пишет, что прога не будет рабить... Ну щас узнаем!

Offline

#16  28.12.11 19:46

Re: [C++] winsock 2.0 Проблемы реализации

Мда... Она и правда не работает :( Задал параметры вот так:

Код::

int port = 23;
	char* targetip = "hostel.nstu.ru";

А вот результат меня не впечатлил...
http://hostel.nstu.ru/uploaded/gallery/ … 076094.jpg

В примечании сказано, что программа не будет работать так как не вызвана функция send() и массив output[] не освобождается... Вот надо щас прикрутить функцию send()!

Offline

#17  28.12.11 21:57

sav
Профиль

Re: [C++] winsock 2.0 Проблемы реализации

Wanseg, так ты начни с маленького.
Напиши минимальный сервер. Которому ты будешь отправлять байт.
Минимальный клиент, который будет отправлять этот байт.
А потом уже пытайся сделать запрос web-серверу.
И начни с запроса к серверу, который вернет минимальный объем данных. Лучше вообще отправь запрос типа HEAD. Но для начала, опять же пойми, как правильно его сформировать.
Потом попробуй GET запрос.
Не пытайся осилить сразу задачу целиком, если ты только начинаешь.

Offline

Программирование и БД » [C++] winsock 2.0 Проблемы реализации 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.044 сек.
Выполнено 14 запросов.