Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > неразрешенный внешний объект


Автор: redwhite90 7.12.2011, 19:38
Решил пересобрать проект.
не понимаю что не так сделал.теперь появляются такие ошибки:
Код

1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__WSACleanup@0 в функции "public: __thiscall WComm::WComm(void)" (??0WComm@@QAE@XZ)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__WSAGetLastError@0 в функции "public: __thiscall WComm::WComm(void)" (??0WComm@@QAE@XZ)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__socket@12 в функции "public: __thiscall WComm::WComm(void)" (??0WComm@@QAE@XZ)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__WSAStartup@8 в функции "public: __thiscall WComm::WComm(void)" (??0WComm@@QAE@XZ)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__connect@12 в функции "public: void __thiscall WComm::connectServer(char *,int)" (?connectServer@WComm@@QAEXPADH@Z)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__htons@4 в функции "public: void __thiscall WComm::connectServer(char *,int)" (?connectServer@WComm@@QAEXPADH@Z)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__inet_addr@4 в функции "public: void __thiscall WComm::connectServer(char *,int)" (?connectServer@WComm@@QAEXPADH@Z)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__listen@8 в функции "public: void __thiscall WComm::startServer(int)" (?startServer@WComm@@QAEXH@Z)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__bind@12 в функции "public: void __thiscall WComm::startServer(int)" (?startServer@WComm@@QAEXH@Z)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__accept@12 в функции "public: void __thiscall WComm::waitForClient(void)" (?waitForClient@WComm@@QAEXXZ)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__send@16 в функции "public: int __thiscall WComm::sendData(char *)" (?sendData@WComm@@QAEHPAD@Z)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__recv@16 в функции "public: int __thiscall WComm::recvData(char *,int)" (?recvData@WComm@@QAEHPADH@Z)
1>wcomm.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__closesocket@4 в функции "public: void __thiscall WComm::closeConnection(void)" (?closeConnection@WComm@@QAEXXZ)
1

вот код
wcom.h
Код


#include "winsock2.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <fstream>
#include <tchar.h>
#include <strsafe.h>
#include <string>
#include <cstring>
#include<windows.h>
#ifndef WCOME_H
#define WCOME_H
class WComm
{

public:

    WComm();

    void connectServer(char*,int);
    int sendData(char*);
    int recvData(char*,int);
    void fileSend(char*);
    void fileReceive(char*);
    void startServer(int);
    void waitForClient();
    void closeConnection();
};

#endif

wcom.cpp
Код

#include "wcomm.h"

WSADATA wsaData;
SOCKET m_socket;
SOCKET m_backup;
sockaddr_in con;
SOCKET AcceptSocket;
using namespace std;

BOOL GetLastWriteTime(HANDLE hFile, LPTSTR lpszString, DWORD dwSize);
//всем
WComm::WComm()
{

    // Initialize Winsock.
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    // AF_INET - сокет Интернета
    // SOCK_STREAM - потоковый сокет (с установкой соединения)
    // 0 - по умолчанию выбирается TCP протокол
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return;
    }
    //копируем сокет
    m_backup = m_socket;


}

// Good Programmer don't comment this
//WComm::~WComm(){WSACleanup();}

void WComm::connectServer(char *ip,int port)
{
    // Connect to a server.
    con.sin_family = AF_INET;
    con.sin_addr.s_addr = inet_addr( ip );
    con.sin_port = htons( port );

    if ( connect( m_socket, (SOCKADDR*) &con, sizeof(con) ) == SOCKET_ERROR) {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return;
    }
}


void WComm::startServer(int port)
{
    // Connect to a server связывание сокета с локальным адресом.
    con.sin_family = AF_INET;//
    con.sin_addr.s_addr = inet_addr( "0.0.0.0" );
    con.sin_port = htons( port );
    // вызываем bind для связывания
    if ( bind( m_socket, (SOCKADDR*) &con, sizeof(con) ) == SOCKET_ERROR) {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return;
    }

    // Listen on the socket.
    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");

}

void WComm::waitForClient()
{
    AcceptSocket = INVALID_SOCKET;
    //разрешаем попытку входящего соединения на сервер
    while ( AcceptSocket == INVALID_SOCKET ) {
        AcceptSocket = accept( m_backup, NULL, NULL );
    }
    m_socket = AcceptSocket;
    //m_socket-новый сокет 
}

int WComm::sendData(char *sendbuf)
{
    return send( m_socket, sendbuf, strlen(sendbuf), 0 );
}


int WComm::recvData(char *recvbuf,int size)
{
    int sz = recv( m_socket, recvbuf, size, 0 );
    recvbuf[sz] = '\0';
    return sz;
}


void WComm::closeConnection()
{
    closesocket(m_socket);
    m_socket = m_backup;
}


void WComm::fileReceive(char *filename)
{

    char rec[50] = "";
    HANDLE hFile;
    TCHAR szBuf[MAX_PATH];
    string s1;

    recv( m_socket, filename, 32, 0 );
    send( m_socket, "OK", strlen("OK"), 0 );


    hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,CREATE_ALWAYS, 0, NULL);

    GetLastWriteTime( hFile, szBuf, MAX_PATH );

    CloseHandle(hFile);   

    FILE *fw = fopen(filename, "wb");

    int recs = recv( m_socket, rec, 32, 0 );//приняли размер файла
    send( m_socket, "OK", strlen("OK"), 0 );

    rec[recs]='\0';
    int size = atoi(rec);


    while(size > 0)
    {
        char buffer[1030];

        if(size>=1024)
        {
            recv( m_socket, buffer, 1024, 0 );
            send( m_socket, "OK", strlen("OK"), 0 );
            fwrite(buffer, 1024, 1, fw);

        }
        else
        {
            recv( m_socket, buffer, size, 0 );
            send( m_socket, "OK", strlen("OK"), 0 );
            buffer[size]='\0';
            fwrite(buffer, size, 1, fw);
        }


        size -= 1024;

    }
    char fn[MAX_PATH], fn1[MAX_PATH];
    int i=0;
    //strcpy(s,szBuf);
    strcpy(fn, filename);
    string s_tmp;
    for(int i=strlen(filename)-1;fn[i+1]!='.';i--)
    {
        s_tmp=fn[i];
        s1.insert(0,s_tmp);

    }
    s1.resize(s1.length());
    string s2;
    for(int i=0;i<MAX_PATH;i++)
    {
        s_tmp=szBuf[i];
        s2.push_back(szBuf[i]);
    }
    s2.resize(strlen(szBuf));
    string s3;
    s3=s2+s1;

    fclose(fw);
    rename(fn, s3.c_str());
}

void WComm::fileSend(char *fpath)
{

    // Extract only filename from given path.
    char filename[50];
    int i=strlen(fpath);
    for(;i>0;i--)if(fpath[i-1]=='\\')break;
    for(int j=0;i<=(int)strlen(fpath);i++)filename[j++]=fpath[i];
    ////////////////////////////////////////

    ifstream myFile (fpath, ios::in|ios::binary|ios::ate);
    int size = (int)myFile.tellg();//текущая позиция в потоке
    myFile.close();

    char filesize[10];itoa(size,filesize,10);


    send( m_socket, filename, strlen(filename), 0 );//отправляем имя
    char rec[32] = "";recv( m_socket, rec, 32, 0 );

    send( m_socket, filesize, strlen(filesize), 0 );//отправляем размер файла
    recv( m_socket, rec, 32, 0 );//принимаем подтверждение


    FILE *fr = fopen(fpath, "rb");

    while(size > 0)
    {
        char buffer[1030];

        if(size>=1024)
        {
            fread(buffer, 1024, 1, fr);
            send( m_socket, buffer, 1024, 0 );
            recv( m_socket, rec, 32, 0 );

        }
        else
        {
            fread(buffer, size, 1, fr);
            buffer[size]='\0';
            send( m_socket, buffer, size, 0 );
            recv( m_socket, rec, 32, 0 );
        }


        size -= 1024;

    }

    fclose(fr);

}

BOOL GetLastWriteTime(HANDLE hFile, LPTSTR lpszString, DWORD dwSize)
{
    FILETIME ftCreate, ftAccess, ftWrite;
    SYSTEMTIME stUTC, stLocal;
    DWORD dwRet;

    // Retrieve the file times for the file.
    if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
        return FALSE;

    // Convert the last-write time to local time.
    FileTimeToSystemTime(&ftWrite, &stUTC);
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);

    // Build a string showing the date and time.
    dwRet = StringCchPrintf(lpszString, dwSize, 
        TEXT("%02d-%02d-%02d-%02d-%02d-%02d"),
        stLocal.wDay,stLocal.wMonth,stLocal.wYear,
        stLocal.wHour, stLocal.wMinute, stLocal.wSecond);

    if( S_OK == dwRet )
        return TRUE;
    else return FALSE;
}


main.cpp
Код

#include"wcomm.h"
#include <string>
#include "winsock2.h"
#include <clocale>
#define QUIT 9
#define IP "127.0.0.1"
using namespace std;
void runclient(char *ip);
void runserver();


WComm w;

#include <gdiplus.h>

#pragma comment(lib, "GdiPlus.lib") /* наш многострадальный lib-файл */
using namespace Gdiplus; /* как хочешь, но мне не в кайф постоянно писать Gdiplus:: */
//7bdc1c72-01bb-4802-9998-6a5cb402006b
static const GUID bmp= //{0x7bdc1c72, 0x01bb, 0x4802, {0x99,0x98,0x6a,0x5c,0xb4,0x02,0x00,0x6b}};
{ 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };

void runclient(char *ip);
void runserver();
char SCREENPATH[50]= "c:\\screen\\screen.bmp";
#define SCREENPATHL L"c:\\screen\\screen.bmp"

void createscreen ()
{

    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    HDC scrdc, memdc;
    HBITMAP membit;
    scrdc = GetDC(0);
    int Height, Width;
    Height = GetSystemMetrics(SM_CYSCREEN);
    Width = GetSystemMetrics(SM_CXSCREEN);
    memdc = CreateCompatibleDC(scrdc);
    membit = CreateCompatibleBitmap(scrdc, Width, Height);
    SelectObject(memdc, membit);
    BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
    HBITMAP hBitmap;
    hBitmap =(HBITMAP) SelectObject(memdc, membit);
    Gdiplus::Bitmap bitmap(hBitmap, NULL);
    bitmap.Save(SCREENPATHL, &bmp);

    DeleteObject(hBitmap);

}

void main(/*int argc, char *argv[]*/)
{
    setlocale(LC_ALL, "rus");
    int t, quit, i;
    char s[1024],s1[1024];
    cout<<"type:\n1-run server\n2-run client"<<endl;
    cin >> t;
    strcpy(s,IP);
    if(t==1)
        runserver();
    else 
    {
        runclient(s);
    }
}

void runserver()
{
    // Start Server Daemon
    w.startServer(27015);
    printf("Server Started........\n");

    while (TRUE) 
    {

        // Wait until a client connects
        w.waitForClient();
        printf("Client Connected......\n");

        // Work with client
        while(TRUE)
        {
            char rec[50] = "";//принимаем данные от клиента
            w.recvData(rec,32);w.sendData("OK");//отправляем, что приняли 

            if(strcmp(rec,"FileSend")==0)
            {
                char fname[32] ="";
                w.fileReceive(fname);//принимаем имя файла
                printf("File Received.........\n");
            }


            if(strcmp(rec,"EndConnection")==0)
            {
                printf("Connection Ended......\n");
                break;
            }
        }

        // Disconnect client
        w.closeConnection();
    }

}

void runclient(char *ip)
{
    char rec[32] = "";

    // Connect To Server
    w.connectServer(ip,27015);
    printf("Connected to server...\n");

    // Sending File
    int end;
    char fpath[1024];
    int k=0, t=0;
    cout<<"Введите количество передаваемых скриншотов: > ";
    cin>>k;
    cout<<"Введите интервал создания скриншотов в секундах: > ";
    cin>>t;
    do
    {
        createscreen();
        w.sendData("FileSend");    w.recvData(rec,32);
        w.fileSend(SCREENPATH);
        printf("File Sent.............\n");
        //cout<<"you want to end send of files type 9 and else other symbol  "<<endl;
        k--;
        Sleep(t*1000);
        //cin>>end;
    }while(k>0);

    // Send Close Connection Signal
    w.sendData("EndConnection");w.recvData(rec,32);
    printf("Connection ended......\n");
}



но в проекте ещё непоятные папки 
WS Lib 
App Using WS Lib

Автор: boostcoder 7.12.2011, 20:09
линковать нужно с ws2_32

Автор: redwhite90 7.12.2011, 20:57
научите?

Автор: boostcoder 7.12.2011, 21:01
Цитата(redwhite90 @  7.12.2011,  20:57 Найти цитируемый пост)
научите?

сейчас, я наверное должен поинтересоваться о том, какой используете компилятор/IDE smile 

Автор: redwhite90 7.12.2011, 21:03
visual studio 2010 )

Автор: boostcoder 7.12.2011, 21:34
добавь в main после хидеров:
Код

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


Автор: redwhite90 7.12.2011, 22:51
а теперб вот так
Код

1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__DeleteObject@4 в функции "void __cdecl createscreen(void)" (?createscreen@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__BitBlt@36 в функции "void __cdecl createscreen(void)" (?createscreen@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__SelectObject@8 в функции "void __cdecl createscreen(void)" (?createscreen@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__CreateCompatibleBitmap@12 в функции "void __cdecl createscreen(void)" (?createscreen@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__CreateCompatibleDC@4 в функции "void __cdecl createscreen(void)" (?createscreen@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__GetSystemMetrics@4 в функции "void __cdecl createscreen(void)" (?createscreen@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__GetDC@4 в функции "void __cdecl createscreen(void)" (?createscreen@@YAXXZ)

Автор: boostcoder 7.12.2011, 23:48
еще это добавь:
Код

#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "user32.lib")

Автор: boostcoder 9.12.2011, 00:18
redwhite90, помогло?
тему закрой.

Автор: redwhite90 9.12.2011, 00:21
дааа..... зарабьотало....
а объясните мне, темному, про эти подключения - что когда подключать

Автор: redwhite90 9.12.2011, 18:01
это какие-то либы для winsock2.h ? 

Автор: xvr 12.12.2011, 13:28
Цитата(redwhite90 @  9.12.2011,  00:21 Найти цитируемый пост)
а объясните мне, темному, про эти подключения - что когда подключать 

Все просто -
  •  Берешь имя функции, на которую ругался линкер (например - __imp__WSACleanup@0)
  •  Убираешь __imp__ и все, что идет после @
  •  Открываешь http://msdn.microsoft.com/en-us/default.aspx, и вбиваешь в поиск то, что получилось (WSACleanup)
  •  Открываешь описание, листаешь в самый низ
  •  В разделе Requirements -> Library читаешь - Ws2_32.lib
  •  Пишешь у себя соответствующую прагму

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)