Как сделать так, чтобы клиент принимал от двух серверов сообщения в разных потоках? Собственно я сделал следующее, инициализировал настройки под два сокета с разными портами и одним локальным ip, так как тестирую на одной машине, потом в while(1) создаю нить и принимаю от одного сокета. Я просто не могу понять как сделать так, чтобы программа понимала с какого порта прием(или сокета). Может я не разобрался в теме конечно, направте пожалуйста.)
Код | // tcp_client.cpp: определяет точку входа для консольного приложения. //
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #include <string.h> #include <Windows.h> #include <fstream> #include <iostream>
using namespace std; #define SERVERADDR "192.168.1.8" DWORD WINAPI priem(LPVOID ); #pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[]) { char buff[1024]; int *port = new int[2]; //ifstream fin("Config.txt"); //выделим память под количество портов port[0] = 666; port[1] = 667; memset(buff, '0', 1024);//очищаем наш буфер от мусора SetConsoleCP(1251); SetConsoleOutputCP(1251);
printf("TCP DEMO CLIENT\n"); //шаг 1 - инициализация библиотеки Winsock if (WSAStartup(0x202, (WSADATA *)&buff[0])) { printf("WSAStart error %d\n", WSAGetLastError()); return -1; } //Шаг 2 - создание сокета
SOCKET *my_sock = new SOCKET[2]; for (int i = 0; i < 2; i++)//2 - это количество соединений { my_sock[i] = socket(AF_INET, SOCK_STREAM, 0);
if (my_sock[i] < 0) { printf("Socket() error %d\n", WSAGetLastError()); return -1; }
//Шаг 3 - установка соединения//для клиента //заполнение структуры sockaddr_in //указание адреса и порта сервера sockaddr_in* dest_addr = new sockaddr_in[2];
dest_addr[i].sin_family = AF_INET; dest_addr[i].sin_port = htons(port[i]); HOSTENT **hst = new HOSTENT*[2]; //преобразование IP адреса из символьного в сетевой формат if (inet_addr(SERVERADDR) != INADDR_NONE) dest_addr[i].sin_addr.s_addr = inet_addr(SERVERADDR); //попытка получить IP адрес по доменному //имени сервера if (hst[i] = gethostbyname(SERVERADDR)) //hst->h_addr_list содержит не массив адресов, //а массив указателей на адреса ((unsigned long*)&dest_addr[i].sin_addr)[0] = ((unsigned long **)hst[i]->h_addr_list)[0][0]; else { printf("Invalid address %s\n", SERVERADDR); closesocket(my_sock[i]); WSACleanup(); return -1; }
if (connect(my_sock[i], (sockaddr*)&dest_addr[i], sizeof(dest_addr[i]))) { printf("Connect error %d\n", WSAGetLastError()); return -1; } }
while (1) { //выводим на экран //читаем пользовательский ввод с клавиатуры
DWORD thID;// CreateThread(NULL, NULL, priem, my_sock, NULL, &thID);
//проверка на "quit"
//передаем строку клиента серверу } }
DWORD WINAPI priem(LPVOID pmy_sock) { SOCKET * my_sock = (SOCKET *)pmy_sock; char buff[1024]; int recvb=0; recvb=recv(my_sock[1], &buff[0], strlen(buff)+1, 0); for (int i = 0; i<recvb;i++) printf("%c",buff[i]); //send(my_sock[0],&buff[0],recvb,0); return 0; }
|
|