Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   сокеты ошибка при компилировании (http://forum.oszone.net/showthread.php?t=262856)

Gooch 20-06-2013 22:31 2171443

сокеты ошибка при компилировании
 
Всем привет! Есть клиент:
читать дальше »

#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 2171468

Gooch, исходя из описания ошибки, Вы в своем проекте не отключили использование "precompiled headers". Решение есть по ссылке.

Gooch 21-06-2013 08:41 2171545

Цитата:

Цитата deviance
precompiled headers »

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

deviance 21-06-2013 08:55 2171547

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

Gooch 21-06-2013 20:16 2171875

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

mrcnn 24-06-2013 07:27 2173100

Чтобы не париться с указанием в настройках можно попробовать указать библиотеку директивой в коде после инклудов

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

Gooch 24-06-2013 12:12 2173262

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

Gooch 25-06-2013 14:50 2173974

ап, вообщем есть код проги с моего верхнего поста в нормальном так сказать варианте, не могу разобраться с ошибками:

читать дальше »

Код:

#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 2174489

Один из do у вас без закрывающего while - от этого ошибка.


Время: 14:47.

Время: 14:47.
© OSzone.net 2001-