Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2013, 19:19   #1
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию ошибка winsock в MSVS 2010

вот кусок кода windows forms:
Код:
 WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa)==0)
	 {richTextBox1->AppendText(" init ok ");
	 richTextBox1->AppendText(gcnew String(wsa.szDescription));} else {richTextBox1->AppendText(" init error ");}
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock!=-1){richTextBox1->AppendText(" socket ok");}
 else {richTextBox1->AppendText(" socket error");}
sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr( "213.180.204.26" );
dest_addr.sin_port = htons(80);
dest_addr.sin_family = AF_INET;
if (connect(sock,(struct sockaddr*)&dest_addr,sizeof(dest_addr))== SOCKET_ERROR) {richTextBox1->AppendText(" connect error ");} else {richTextBox1->AppendText(" connect ok ");}
int sended;
strcpy(buf,"Get /index.php HTTP/1.0\r\nHost: yandex.ru\r\nAccept: */* \r\nConnection: close\r\n\r\n");//"Get /index.php HTTP/1.0\r\nHost: yandex.ru\r\nAccept: */* \r\nConnection: close\r\n\r\n"
richTextBox1->AppendText(gcnew String(buf));
do {
sended=send(sock,buf,strlen(buf),0);
if (sended=-1){richTextBox1->AppendText(" ошибка отправки ");break;} else richTextBox1->AppendText(" отправлено: ");
richTextBox1->AppendText(gcnew String(buf));
richTextBox1->AppendText(" отправлено байт:");
richTextBox1->AppendText(gcnew String(Convert::ToString(sended)));
substr(buf1,buf,sended,strlen(buf));
strcpy(buf,buf1);
}
while (sended <= strlen(buf));
//**************************************
do {
sended=recv(sock,buf,strlen(buf),0);
if (sended=-1){richTextBox1->AppendText(" ошибка приёма ");break;} else richTextBox1->AppendText(" отправлено: ");
richTextBox1->AppendText(gcnew String(buf));
richTextBox1->AppendText(" принято байт:");
richTextBox1->AppendText(gcnew String(Convert::ToString(sended)));
substr(buf1,buf,sended,strlen(buf));
strcpy(buf,buf1);
}
while (sended <= strlen(buf));
инициализация ворачивает winsock2.0 коннект и сокет проходит, а send и recv возвращают ошибку SOCKET_ERROR(-1). если в цикл отправки исправить так(if (=) заменить на if (==) ) :
Код:
do {
sended=send(sock,buf,strlen(buf),0);
if (sended=SOCKET_ERROR){richTextBox1->AppendText(" ошибка отправки ");break;} else richTextBox1->AppendText(" отправлено: ");
richTextBox1->AppendText(gcnew String(buf));
richTextBox1->AppendText(" отправлено байт:");
richTextBox1->AppendText(gcnew String(Convert::ToString(sended)));
substr(buf1,buf,sended,strlen(buf));
strcpy(buf,buf1);
}
while (sended <= strlen(buf));
то вообще вылетает с рантайм ошибкой:
Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:\my_MSVS_progs\try_winsock2_form appl\Debug\try_winsock2_formappl.ex e'.
Additional Information: The runtime has encountered a fatal error. The address of the error was at 0x69a11f2b, on thread 0x348. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

что я непонял про винсок и как это исправить?
ЗЫ: рантайм вылетает на строке substr(buf1,buf,sended,strlen(buf)) ; а эта функция
Код:
for (i=0;j=(n-1+m);i++,j++) v[i]=s[j];
не может ошибаться
varich вне форума Ответить с цитированием
Старый 22.06.2013, 19:25   #2
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Цитата:
ЗЫ: рантайм вылетает на строке substr(buf1,buf,sended,strlen(buf)) ;
И где объявление и инициализация используемых переменных?

П.С. Казалось бы причем тут винсок... Ошибка в вашем коде, а не в винсок студии.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 22.06.2013, 20:18   #3
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию

полный код ф-ии:
Код:
void substr(char v[],char s[],int n,int m)
{ int i,j;
for (i=0;j=(n-1+m);i++,j++) v[i]=s[j];
v[i]='\0';
}
ЗЫ полностью слизана с книжки
глобальные переменные:
Код:
  ADDRINFOA addr;
  ADDRINFOA *serv_addr;
SOCKET sock;
char buf[1024],buf1[1024];

Последний раз редактировалось varich; 22.06.2013 в 20:21.
varich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows Forms in MSVS C++ Express 2010 stpdqstns Windows Forms 3 14.02.2013 10:19
Qt 4.8.2 + MSVS 2010 (add-in) - unresolved external symbol LNK2001, LNK2019 FYBVFPFYBC Qt и кроссплатформенное программирование С/С++ 1 05.08.2012 00:15
в именах функций вначале появляются знаки подчёркивания (MSVS 2010) rpy3uH Visual C++ 3 22.02.2012 16:33
Стандартные каталоги MSVS 2010 Selestis Visual C++ 2 08.10.2011 03:20
WinSock и Delphi 2010 Nicker Работа с сетью в Delphi 0 15.04.2010 21:09