Всем доброго времени суток.
Имеется сервер и клиент. Нужно с клиента переслать бинарный файл на сервер и исполнить его.
Файл открывается в бинарном режиме, читает в буфер, делает send. Сервер делает recv и из буфера записывает в файл, потом переименовывает.
Пытаюсь переслать и получаю ошибку: "Сделана попытка выполнить операцию на объекте, не являющемся сокетом."
сервер
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <locale.h>
#include <string>
#pragma comment(lib, "Ws2_32.lib")
#define PORT 6091
void getError(DWORD errCode)
{
char* error;
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
errCode != 0 ? errCode : WSAGetLastError(),
MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT),
error,
sizeof(error),
NULL);
printf("\nОшибка: %s\n", error);
getchar();
}
int main()
{
setlocale(LC_ALL, "Russian");
WSADATA winsock;
if (FAILED(WSAStartup(MAKEWORD(1, 1), &winsock)))
{
DWORD error = WSAGetLastError();
getError(error);
return -1;
}
SOCKET sock, sub;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
{
DWORD error = WSAGetLastError();
getError(error);
return -2;
}
sockaddr_in addr;
sockaddr_in incomingAddress;
int addressLen = sizeof(incomingAddress);
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (bind(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
DWORD error = WSAGetLastError();
getError(error);
return -3;
}
if (listen(sock, SOMAXCONN) == SOCKET_ERROR)
{
DWORD error = WSAGetLastError();
getError(error);
return -4;
}
char buffer[200];
FILE * prin_file;
std::string fname = "file" + std::to_string(rand() % 1000) + ".exe";
char new_name[20];
memset(new_name, 0, sizeof(fname));
strncpy(new_name, fname.c_str(), sizeof(new_name) - 1);
prin_file = fopen(new_name, "wb");
printf("Ожидание подключения\n");
for (;;)
{
sub = accept(sock, (sockaddr*)&incomingAddress, &addressLen);
if (sub != INVALID_SOCKET)
{
printf("Клиент подключен!\n");
for (;;) {
int recv_chars = recv(sub, buffer, 200, 0);
if (recv_chars > 0)
{
printf("Получено байт: %d\n", recv_chars);
fwrite(buffer, 5, 200, prin_file);
}
else if (recv_chars == 0)
{
printf("Соединение закрыто\n");
break;
} else if (recv_chars == SOCKET_ERROR)
{
DWORD error = WSAGetLastError();
getError(error);
return -5;
break;
}
}
}
}
fclose(prin_file);
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(si));
if(!CreateProcess((LPCSTR)prin_file, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi))
{
DWORD error = WSAGetLastError();
getError(error);
return -6;
}
closesocket(sub);
closesocket(sock);
WSACleanup();
return 0;
}
клиент
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <locale.h>
#include <string>
#pragma comment(lib, "Ws2_32.lib")
#define PORT 6091
void getError(DWORD errCode)
{
char error[1000];
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
WSAGetLastError(),
MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT),
error, sizeof(error), NULL);
printf("\nОшибка: %s\n", error);
getchar();
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "Russian");
WSADATA winsock;
SOCKET sock;
if ((WSAStartup(MAKEWORD(2, 0), &winsock))!=NO_ERROR)
{
DWORD error = WSAGetLastError();
getError(error);
return -1;
}
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
{
DWORD error = WSAGetLastError();
getError(error);
return -2;
}
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(PORT);
if (connect(sock, (sockaddr*)&addr, sizeof(addr)) != 0)
{
DWORD error = WSAGetLastError();
getError(error);
return -3;
}
printf("Подключение успешно !\n");
printf("Посылаю файл .. \n");
FILE *otpr_file;
char buff[200];
memset(buff, 0, 200);
if ((otpr_file = fopen("D:\\Projects\\server_client\\Debug\\rufus.exe", "rb")) == NULL)
{
printf("Ошибка открытия файла.\n");
return -4;
}
else
{
for (;;)
{
fread(buff, 5, 200, otpr_file);
int send_chars = send(sock, buff, 200, 0);
if (send_chars > 0)
{
printf("Получено байт: %d\n", send_chars);
}
else if (send_chars == 0)
{
printf("Соединение закрыто\n");
break;
}
else if (send_chars == SOCKET_ERROR)
{
DWORD error = WSAGetLastError();
getError(error);
return -5;
break;
}
}
fclose(otpr_file);
closesocket(sock);
WSACleanup();
return 0;
}
}