Всем доброго времени суток. Имеется сервер и клиент. Нужно с клиента переслать бинарный файл на сервер и исполнить его. Файл открывается в бинарном режиме, читает в буфер, делает 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[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; } }
|
сервер
Код | #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; }
|
|