Важная информация
Показано с 1 по 2 из 2

Тема: Пересылка бинарного файла с клиента на сервер

  1. #1 Пересылка бинарного файла с клиента на сервер 
    Новичок
    Регистрация
    24.11.2016
    Сообщений
    3
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Всем доброго времени суток.
    Имеется сервер и клиент. Нужно с клиента переслать бинарный файл на сервер и исполнить его.
    Файл открывается в бинарном режиме, читает в буфер, делает send. Сервер делает recv и из буфера записывает в файл, потом переименовывает.
    Пытаюсь переслать и получаю ошибку: "Сделана попытка выполнить операцию на объекте, не являющемся сокетом."
    клиент
    C++ Code:
    1. #include <WinSock2.h>
    2. #include <Windows.h>
    3. #include <stdio.h>
    4. #include <locale.h>
    5. #include <string>
    6.  
    7. #pragma comment(lib, "Ws2_32.lib")
    8.  
    9. #define PORT 6091
    10.  
    11. void getError(DWORD errCode)
    12.    {
    13.    char error[1000];
    14.    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
    15.                  NULL,
    16.                  WSAGetLastError(),
    17.                  MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT),
    18.                  error, sizeof(error), NULL);
    19.    printf("\nОшибка: %s\n", error);
    20.    getchar();
    21.    }
    22.  
    23. int main(int argc, char *argv[])
    24. {
    25.  
    26. setlocale(LC_ALL, "Russian");
    27.  
    28. WSADATA winsock;
    29. SOCKET sock;
    30. if ((WSAStartup(MAKEWORD(2, 0), &winsock))!=NO_ERROR)
    31. {
    32. DWORD error = WSAGetLastError();
    33. getError(error);
    34. return -1;
    35. }
    36.  
    37. sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    38. if (sock == INVALID_SOCKET)
    39. {
    40. DWORD error = WSAGetLastError();
    41. getError(error);
    42. return -2;
    43. }
    44.  
    45. sockaddr_in addr;
    46. memset(&addr, 0, sizeof(addr));
    47. addr.sin_family = AF_INET;
    48. addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    49. addr.sin_port = htons(PORT);
    50.  
    51. if (connect(sock, (sockaddr*)&addr, sizeof(addr)) != 0)
    52. {
    53. DWORD error = WSAGetLastError();
    54. getError(error);
    55. return -3;
    56. }
    57.  
    58. printf("Подключение успешно !\n");
    59. printf("Посылаю файл .. \n");
    60.  
    61. FILE *otpr_file;
    62. char buff[200];
    63. memset(buff, 0, 200);
    64. if ((otpr_file = fopen("D:\\Projects\\server_client\\Debug\\rufus.exe", "rb")) == NULL)
    65. {
    66. printf("Ошибка открытия файла.\n");
    67. return -4;
    68. }
    69. else
    70. {
    71. for (;<img src="http://iforum.pro/images/smilies/wink.png" border="0" alt="" title="Wink" class="inlineimg" />
    72. {
    73. fread(buff, 5, 200, otpr_file);
    74. int send_chars = send(sock, buff, 200, 0);
    75. if (send_chars > 0)
    76. {
    77. printf("Получено байт: %d\n", send_chars);
    78. }
    79. else if (send_chars == 0)
    80. {
    81. printf("Соединение закрыто\n");
    82. break;
    83. }
    84. else if (send_chars == SOCKET_ERROR)
    85. {
    86. DWORD error = WSAGetLastError();
    87. getError(error);
    88. return -5;
    89. break;
    90. }
    91. }
    92. fclose(otpr_file);
    93. closesocket(sock);
    94. WSACleanup();
    95. return 0;
    96. }
    97. }


    сервер
    C++ Code:
    1. #include <WinSock2.h>
    2. #include <Windows.h>
    3. #include <stdio.h>
    4. #include <locale.h>
    5. #include <string>
    6.  
    7. #pragma comment(lib, "Ws2_32.lib")
    8.  
    9. #define PORT 6091
    10.  
    11. void getError(DWORD errCode)
    12.    {
    13.    char* error;
    14.    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
    15.       NULL,
    16.       errCode != 0 ? errCode : WSAGetLastError(),
    17.       MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT),
    18.       error,
    19.       sizeof(error),
    20.       NULL);  
    21.    printf("\nОшибка: %s\n", error);
    22.    getchar();
    23.    }
    24.  
    25. int main()
    26.    {
    27. setlocale(LC_ALL, "Russian");
    28.  
    29.    WSADATA winsock;
    30.    if (FAILED(WSAStartup(MAKEWORD(1, 1), &winsock)))
    31.    {
    32.    DWORD error = WSAGetLastError();
    33.    getError(error);
    34.    return -1;
    35.    }
    36.    SOCKET sock, sub;
    37.    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    38.    if (sock == INVALID_SOCKET)
    39.    {
    40.    DWORD error = WSAGetLastError();
    41.    getError(error);
    42.    return -2;
    43.    }
    44.    sockaddr_in addr;
    45.   
    46.    sockaddr_in incomingAddress;
    47.    int addressLen = sizeof(incomingAddress);
    48.    memset(&addr, 0, sizeof(addr));
    49.    addr.sin_family = AF_INET;
    50.    addr.sin_port = htons(PORT);
    51.    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    52.    if (bind(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
    53.    {
    54.    DWORD error = WSAGetLastError();
    55.    getError(error);
    56.    return -3;
    57.    }
    58.  
    59.   if (listen(sock, SOMAXCONN) == SOCKET_ERROR)
    60.   {
    61.   DWORD error = WSAGetLastError();
    62.    getError(error);
    63.    return -4;
    64.    }
    65.   char buffer[200];
    66.   FILE * prin_file;
    67.   std::string fname = "file" + std::to_string(rand() % 1000) + ".exe";
    68.   char new_name[20];
    69.   memset(new_name, 0, sizeof(fname));
    70.   strncpy(new_name, fname.c_str(), sizeof(new_name) - 1);
    71.   prin_file = fopen(new_name, "wb");
    72.    printf("Ожидание подключения\n");
    73.    for (;<img src="http://iforum.pro/images/smilies/wink.png" border="0" alt="" title="Wink" class="inlineimg" />
    74.    {
    75.    sub = accept(sock, (sockaddr*)&incomingAddress, &addressLen);
    76.    if (sub != INVALID_SOCKET)
    77.    {
    78.    printf("Клиент подключен!\n");
    79.    for (;<img src="http://iforum.pro/images/smilies/wink.png" border="0" alt="" title="Wink" class="inlineimg" /> {
    80.    int recv_chars = recv(sub, buffer, 200, 0);
    81.    if (recv_chars > 0)
    82.    {
    83.    printf("Получено байт: %d\n", recv_chars);
    84.    fwrite(buffer, 5, 200, prin_file);
    85.    }
    86.    else if (recv_chars == 0)
    87.    {   
    88. printf("Соединение закрыто\n");
    89.  
    90.     break;
    91.    }  else if (recv_chars == SOCKET_ERROR)
    92.    {
    93.    DWORD error = WSAGetLastError();
    94.    getError(error);
    95.    return -5;
    96.    break;
    97.    }
    98.    }    
    99.    }
    100.    }
    101.    fclose(prin_file);
    102.  
    103.    STARTUPINFO si;
    104.    PROCESS_INFORMATION pi;
    105.    memset(&si, 0, sizeof(si));
    106.    memset(&pi, 0, sizeof(si));
    107.    if(!CreateProcess((LPCSTR)prin_file, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi))
    108.    {
    109.    DWORD error = WSAGetLastError();
    110.    getError(error);
    111.    return -6;
    112.    }
    113.    closesocket(sub);
    114.    closesocket(sock);
    115.    WSACleanup();
    116.    return 0;
    117. }
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,935
    Сказал(а) спасибо
    1,845
    Поблагодарили 986 раз(а) в 844 сообщениях
    Записей в блоге
    1
    Разбейте программу на функциональные блоки, пишите логи в файл и отлаживайте постепенно.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 2
    Последнее сообщение: 04.06.2015, 14:10
  2. Написание почтового клиента на C#
    от vladis222 в разделе Фриланс
    Ответов: 0
    Последнее сообщение: 09.04.2015, 14:56
  3. Ответов: 0
    Последнее сообщение: 19.02.2015, 10:33
  4. Ответов: 0
    Последнее сообщение: 19.02.2015, 10:33
  5. Ответов: 0
    Последнее сообщение: 01.12.2014, 18:11
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •