Войти

Показать полную графическую версию : сокеты ошибка при компилировании


Gooch
20-06-2013, 22:31
Всем привет! Есть клиент:

#include <stdio.h>
#include <string.h>
// Включение библиотеки Winsock2
#include <winsock2.h>
#include <windows.h>

// Порт, который использует сервер
#define PORT 13
// Адрес сервера
#define SERVERADDR "192.168.160.1"

int main ( int argc, char* argv [ ] ) {
char buff [ 1024 ] ;
printf ( "TCP Client \n" );

// Инициализация библиотеки Winsock2.
// Если инициализация не удалась, то функция
// возвращает ненулевое значение.

if(WSAStartup(0x202, (WSADATA *) &buff[0])) {
printf("WSAStartup error %d\n",
WSAGetLastError( ));
return -1;
}

// Создается сокет.
// Если функция завершилась успешно то она
// возвращает дескриптор сокета.

SOCKET my_sock ;
my_sock=socket ( AF_INET, SOCK_STREAM, 0 );
if ( my_sock < 0 ) {
printf("Socket error %d\n",
WSAGetLastError( ));
return -1;
}

// Заполнение структуры sockaddr_in
sockaddr_in dest_addr ;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons ( PORT );

// Преобразование ip-адреса из символьного
// в сетевой формат.
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);

// Попытка установки соединения.
// Если по каким-то причинам установить соединение
// не удается, то функция возвращает ненулевое
// значение.

int conn = connect(my_sock,
(sockaddr *) &dest_addr, sizeof(dest_addr));

if (conn !=0 ) {
printf ("Connect error %d\n",
WSAGetLastError( ));
return -1;
}

printf("Соединение с %s установлено",
SERVERADDR);

int nsize;
bool repeat = true;
while ( repeat ) {
// Чтение ответа сервера
nsize = recv(my_sock, &buff[0],
sizeof(buff)-1,0);

if(nsize == 0) {
// Если прочитано 0 байт, это означает, что
// соединение закрыто сервером. Выполнение
// программы завершается
repeat = false;
printf ( " Exit " );
closesocket ( my_sock ) ;
WSACleanup ( ) ;
return 0;

} else if(nsize == SOCKET_ERROR) {
// Обработка ошибки чтения из сокета
repeat = false;
printf("Recv error %d\n",
WSAGetLastError( ));
closesocket ( my_sock ) ;
WSACleanup ( ) ;
return -1;
} else {
// Данные прочитаны успешно
// Добавление завершающего ноля в конец строки
buff[ nsize ] = 0;
// Вывод на экран
printf ( " Date: %s ", buff ) ;

}
}
}


не могу скомпилировать у себя в vs 2010, как бы на с++ вообще не шарю, визуалстудиа на с# настраивал и начинал изучать, а тут задачка от препода, при компиляция вываливается ошибка с4627 по библиотекам, я так понимаю winsock2.h string.h windows.h не подключается, излазил уже кучу форумов, не могу разобраться :( Очень прошу помощи.

deviance
21-06-2013, 00:00
Gooch, исходя из описания ошибки (http://msdn.microsoft.com/en-us/library/bb531441%28v=vs.90%29.aspx), Вы в своем проекте не отключили использование "precompiled headers". Решение есть по ссылке.

Gooch
21-06-2013, 08:41
precompiled headers »

отключал, после этого начинает ругаться примерно так: LNK2019 и в нем все что касается WSA, при этом не показывает строки в которых ошибка. И ещё вопрос, когда писал на с# у меня каждую команду подсвечивал VS да и предлагал варианты, а с с++ кроме как char и int ни чего не знает, так должно быть?

deviance
21-06-2013, 08:55
Gooch, ошибки линкера говорят о том, что линковать приложение нужно с библиотекой сокетов (ws2_32.lib). http://club.shelek.ru/viewart.php?id=35

Gooch
21-06-2013, 20:16
хорошо, может как то не правильно библиотеки подключаю? настройки проекта - линкер - input - в первой строке перечисление библиотек, добавил ws2_32.lib.

mrcnn
24-06-2013, 07:27
Чтобы не париться с указанием в настройках можно попробовать указать библиотеку директивой в коде после инклудов

#pragma comment (lib, "ws2_32.lib")
#pragma comment (lib, "wsock32.lib")

Gooch
24-06-2013, 12:12
сегодня включил ноут и о чудо, заработало :) щас ошибки в коде ищу) спасибо что откликнулись.

Gooch
25-06-2013, 14:50
ап, вообщем есть код проги с моего верхнего поста в нормальном так сказать варианте, не могу разобраться с ошибками:


#include "stdafx.h"
#include <string.h>
#include <iostream>
// Включение библиотеки Winsock2
#include <winsock2.h>
#include <windows.h>

// Порт, который использует сервер
#define PORT 1140
// Адрес сервера
#define SERVERADDR "127.0.0.1"

int main ( int argc, char* argv [ ] )
{
using namespace std;
char buff [ 11000 ] ;
int A, B, C, D, E, F, G, H, I, J;
setlocale(LC_ALL, "Russian");
printf ( "TCP Client \n" );
if(WSAStartup(0x202, (WSADATA *) &buff[0]))
{
printf("WSAStartup error %d\n",
WSAGetLastError( ));
return -1;
}
SOCKET my_sock ;
my_sock=socket ( AF_INET, SOCK_STREAM, 0 );
if ( my_sock < 0 )
{
printf("Socket error %d\n",
WSAGetLastError( ));
return -1;
}
sockaddr_in dest_addr ;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons ( PORT );
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
int nRecv = connect(my_sock,
(sockaddr *) &dest_addr, sizeof(dest_addr));
if (nRecv == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAEHOSTUNREACH)
cout<<"Host unreachable" << endl;
else
printf ("Connect error %d\n",
WSAGetLastError( ));
return -1;
}

printf("Соединение с %s установлено",
SERVERADDR);

char cmd[5];
bool repeat = true;
bool rpt;
int n =0;

do
{
cout << "Enter command (\\get or \\quit)" << endl;
cin.getline (cmd, 10);
strcat_s (cmd, "\n");
int nRecv = send (my_sock, &cmd[0], strlen (cmd), 0);
repeat = true;
A=0; B=0; C=0; D=0; E=0; F=0; G=0; H=0; I=0; J=0;
do
{ ZeroMemory (buff, 11000);
nRecv = recv (my_sock, &buff[0], sizeof (buff)- 1, 0);
if (strstr (buff, "\n") != NULL)
{
rpt = false;
}
if (strstr (buff, "Closing connction") != NULL)
{
rpt = false;
repeat = false;
cout<<buff;
break;
}
cout << buff;
int len = strlen (buff);
for (int i = 0; i<= len; i++)
{
switch (buff[i])
{
case 'a':A++; break;
case 'b':B++; break;
case 'c':C++; break;
case 'd':D++; break;
case 'e':E++; break;
case 'f':F++; break;
case 'g':G++; break;
case 'h':H++; break;
case 'i':I++; break;
case 'j':J++; break;
}
}
}
while (rpt && nRecv > 0);
cout << "a" << A << endl;
cout << "b" << B << endl;
cout << "c" << C << endl;
cout << "d" << D << endl;
cout << "e" << E << endl;
cout << "f" << F << endl;
cout << "g" << G << endl;
cout << "h" << H << endl;
cout << "i" << I << endl;
cout << "j" << J << endl;
if(nRecv == 0)
{
repeat = false;
cout << "Ok..."<< endl;
}
else if(nRecv == SOCKET_ERROR)
{
printf ( " Recv error %d\n", WSAGetLastError());
closesocket ( my_sock ) ;
WSACleanup ( ) ;
return -1;
}
else
{
buff[nRecv] = 0;
if(!strcmp(buff, "Closing connection")) break;
printf("CryptoMessage: %s\n", buff);
}


closesocket (my_sock);
WSACleanup ( ) ;
return 0;
}
}


компилятор ругается на closesocket в конце кода, для интереса закоментил, он начал ругаться на код дальше и в итоге на закрытую скобку, помогите разобраться :( плюс ругался на strcat и заставил меня поставить strcat_s.

mrcnn
26-06-2013, 10:00
Один из do у вас без закрывающего while - от этого ошибка.




© OSzone.net 2001-2012