Я попытался сделать по примерам примерную программу клиент-сервер:
#include <iostream>
#include <sstream>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <string>
#include <fstream>
#include <vector>
#pragma warning(disable:4996)
#pragma comment(lib, "ws2_32.lib")
#define DEFAULT_BUFLEN 1024
using namespace std;
void split(vector<string>& dest, const string& str, const char* delim) {
char* pTempStr = strdup(str.c_str());
char* pWord = strtok(pTempStr, delim);
while (pWord != NULL)
{
dest.push_back(pWord);
pWord = strtok(NULL, delim);
}
free(pTempStr);
}
string calculate(float k, string op, float n) {
ostringstream oss;
if (op == "+") oss << k + n;
else if (op == "-") oss << k - n;
else if (op == "*") oss << k * n;
else if (op == "/") oss << k / n;
else return "Error";
string str_result(oss.str());
return str_result;
}
int main(int argc, char* argv[]) {
string sock_type = "";
string listen_ip = "";
string listen_port = "";
if (argc == 4) {
sock_type = string(argv[1]).substr(1);
listen_ip = string(argv[2]).substr(3);
listen_port = string(argv[3]).substr(3);
}
else return -1;
WSAData wData;
if (WSAStartup(MAKEWORD(2, 2), &wData) == 0)
printf("WSA startup success\n");
else
return -1;
SOCKADDR_IN workon_addr;
workon_addr.sin_addr.S_un.S_addr = inet_addr(listen_ip.c_str());
workon_addr.sin_port = htons(atoi(listen_port.c_str()));
workon_addr.sin_family = AF_INET;
SOCKET workon_sock = socket(AF_INET, SOCK_STREAM, NULL);
if (workon_sock == SOCKET_ERROR) {
printf("Socket creation error\n"); return -1;
}
if (sock_type == "S") {
if (bind(workon_sock, (struct sockaddr*)&workon_addr, sizeof(workon_addr)) != SOCKET_ERROR)
printf("Socket binding successful\n");
else {
printf("Cannot bind socket to this address\n"); return -1;
}
if (listen(workon_sock, SOMAXCONN) != SOCKET_ERROR)
printf("Listening on port %u\n", ntohs(workon_addr.sin_port));
else {
printf("Cannot listen on this address"); return -1;
}
while (true) {
SOCKET client_sock;
SOCKADDR_IN client_addr;
int addr_len = sizeof(client_addr);
if ((client_sock = accept(workon_sock, (struct sockaddr*)&client_addr, &addr_len)) != 0) {
printf("Client connected from %s:%u\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
int recv_size;
char recv_buffer[DEFAULT_BUFLEN];
string recv_string = "";
while ((recv_size = recv(client_sock, recv_buffer, sizeof(recv_buffer), 0)) > 0) {
recv_string.append(recv_buffer, recv_buffer + recv_size);
}
vector<string> values;
split(values, recv_string, " ");
string result = calculate(stof(values[0]), values[1], stof(values[2]));
send(client_sock, result.data(), result.size(), NULL);
closesocket(client_sock);
}
}
}
else if (sock_type == "C") {
string send_buffer;
int recv_size;
char recv_buffer[DEFAULT_BUFLEN];
string recv_string;
connect(workon_sock, (struct sockaddr*)&workon_addr, sizeof(workon_addr));
printf("Your string: ");
getline(cin, send_buffer);
if (send_buffer == "exit") {
closesocket(workon_sock);
WSACleanup();
exit(0);
};
send(workon_sock, send_buffer.data(), send_buffer.size(), NULL);
shutdown(workon_sock, SD_SEND);
while ((recv_size = recv(workon_sock, recv_buffer, sizeof(recv_buffer), 0)) > 0) {
recv_string.append(recv_buffer, recv_buffer + recv_size);
}
cout << "Result: " << recv_string << endl;
closesocket(workon_sock);
WSACleanup();
exit(0);
}
return 0;
}
Я записал весь этот код в cpp файл и когда запустил его без откладки вывелось вот это:
D:\ServerTest\test1\x64\Debug\test1.exe (процесс 10128) завершил работу с кодом -1.
Нажмите любую клавишу, чтобы закрыть это окно...
К сожалению только это выводит. Буду рад за помощь в решении данной проблемы