Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2012, 21:09   #1
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
Вопрос Консольное приложение для обмена сообщениями через интеренет

Решил написать такую программку при помощи которой можно обмениваться сообщениями по средствам интернет ....
И вот я столкнулся с вопросом а как организовать работу двух таких приложений установленных на разных ПК?

Исходя вот из этого для старта:
Код HTML:
// fsender.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <string>

#define maxline 1000


using namespace std;



int main()
{
	setlocale(LC_CTYPE,"Russian");
	char message[maxline];
	char s;
	cout << "Для соединения нажмите 'S' и Enter" << endl;
	cin >> s;
	if(s='s')
		//тут должна быть процедура соединения c удалённым ПК
		cout << "Ожидайте" << endl;
	// как только соединение установлено 
		cout << "Введит ваше сообщение" << endl;
	cin >> message[maxline];

}
stdio вне форума Ответить с цитированием
Старый 02.03.2012, 21:45   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Рекомендую почитать по сокетам.
Вот в MSDN есть примеры
TCP Stream Socket Server
TCP Stream Socket Client

А то вы прямо с козырей зашли.
EUGY вне форума Ответить с цитированием
Старый 02.03.2012, 22:08   #3
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

Немедленно приступаю к чтению.
Цитата:
А то вы прямо с козырей зашли.
А вдруг есть ещё интересное решение))) поэтому я и не стал спрашивать про сокеты
На самом деле уже несколько дней готовлюсь чтоб приступить к реализации этой программки. Очень много примеров нашёл в поисковиках, только не совсем понял принцип работы сокетов так как примеры в большинстве нашпигованы множеством процедур, из которых не все относятся к той процедуре что мне необходима. а так как я начинающий программист мне достаточно затруднительно понять что мне пригодится в моём проекте а что нет. Надеюсь что в примерах MSDN ни чё лишнего не будет.
stdio вне форума Ответить с цитированием
Старый 02.03.2012, 22:28   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Вообще пользуюсь старой локальной справкой, но вот сейчас гянул
http://msdn.microsoft.com/en-us/library/aa454151.aspx
Воды в нем нет.
EUGY вне форума Ответить с цитированием
Старый 02.03.2012, 22:52   #5
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

Значит использовать WINAPI?

Код:
#include <windows.h> 
#include <winsock.h>

#define PORTNUM         5000          // Port number
#define HOSTNAME        "localhost"   // Server name string
                                      // This should be changed
                                      // according to the server.
int WINAPI WinMain (
              HINSTANCE hInstance,    // Handle to the current instance
              HINSTANCE hPrevInstance,// Handle to the previous instance
              LPTSTR lpCmdLine,       // Pointer to the command line
              int nCmdShow)           // Show state of the window
Как я понял мне нужны только вот эти процедуры, с английским я не очень дружу(

Код:
int Status;

  // Initialize Winsocket. 
  if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) 
  {
    wsprintf (szError, TEXT("WSAStartup failed. Error: %d"), 
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    return FALSE;
  }

  // Create a TCP/IP socket that is bound to the server.
  if ((ServerSock = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
  {
    wsprintf (szError, TEXT("Allocating socket failed. Error: %d"), 
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
    WSACleanup ();
    return FALSE;
  }
Код:
 // Send a string to the server.
  if (send (ServerSock, "To Server.", strlen ("To Server.") + 1, 0)
           == SOCKET_ERROR) 
  {
    wsprintf (szError, 
              TEXT("Sending data to the server failed. Error: %d"),
              WSAGetLastError ());
    MessageBox (NULL, szError, TEXT("Error"), MB_OK);
  }
Код:
Close:
  // Close the socket.
  closesocket (ServerSock);
вот ещё интересный вариант нашёл, правда я так понял тут есть ошибка

Код:
 static void Connect()
 {
  if (connected == false)
  {
  str2send = "Connection with server established.\nAwaiting commands...";
  IPEndPoint ip = new IPEndPoint(IPAddress.Any, 9999);
  Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

  socket.Bind(ip);
  socket.Listen(10);
  Console.WriteLine("Waiting for a client...");
  client = socket.Accept();
  IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
  Console.WriteLine("Client connected!\nConnected with {0} at port {1}", clientep.Address, clientep.Port);
  string read = str2send;
  byte[] data = new byte[1024];
  data = Encoding.ASCII.GetBytes(read);
  client.Send(data, data.Length, SocketFlags.None);
  connected = true;
  }
  else
  Console.WriteLine("> already connected to a client");
 }

Последний раз редактировалось stdio; 02.03.2012 в 22:58.
stdio вне форума Ответить с цитированием
Старый 02.03.2012, 23:04   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Второй пример из шарпа, и к с++ отношения не имеет.
Нужна консоль - пиши в консоли, функция входа к делу не относится.
EUGY вне форума Ответить с цитированием
Старый 02.03.2012, 23:18   #7
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

а вот такой вот вариант?

Код:
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>

#define PORT 22222

int main()
{
	struct sockaddr_in addr; 
	WSADATA wsd; 
	SOCKET ls,rs; 
	char r_buf[1024],s_buf[1024]; 
	int r_buflen;

	if(WSAStartup(MAKEWORD(2,2),&wsd) == 0) 
	{
                  
		addr.sin_addr.s_addr = htonl(INADDR_ANY); 
		addr.sin_port        = htons(PORT);       
 INADDR_ANY и PORT 
		addr.sin_family      = AF_INET;
		ls                   = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 

		if(bind(ls,(SOCKADDR*)&addr,sizeof(addr)) == -1) 
		{
			puts("Error : bind()");
		}
		if(listen(ls,3) != -1) 
		{
			rs = accept(ls,NULL,NULL);

			if(rs != -1)
			{
				r_buflen = recv(rs,r_buf,strlen(r_buf),0); 

				if(r_buflen != -1 && r_buflen != 0)
				{


					send(rs,s_buf,strlen(s_buf),0);
				}
			}
		}
		else
		{
			puts("Error : listen()");
		}
	}
	else
	{
		puts("Error : WSAStartup()");
	}
	return 0;
}
stdio вне форума Ответить с цитированием
Старый 02.03.2012, 23:36   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

winsock.h winsock2.h - просто разные версии винсока, вроде не принципиально, не помню.
EUGY вне форума Ответить с цитированием
Старый 02.03.2012, 23:55   #9
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

Вот так сейчас выглядит сервер, что надо исправит или дополнить?

Код:
// fsender.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <winsock.h> 
#include <windows.h>
 
#define SERVER "127.0.0.1"
#define PORT 777 
#define maxline 1000


using namespace std;



int main()
{
	setlocale(LC_CTYPE,"Russian");
	char buff[1024];    
	char message[maxline];
	char s;
	cout << "Для соединения нажмите 'S' и Enter" << endl;
	cin >> s;
	if(s='s')
		//WSAStartup(Ver, lpWSAData)- для работы с библиотекой !!! узнать подробней.
		if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
    {
        printf("Error WSAStartup %d\n", WSAGetLastError());
		return -1;
    }
		//создаём сокет
		SOCKET my_socket;  // 
		my_socket=socket ( AF_INET, SOCK_STREAM, 0 );// AF_INET - для интерент приложений,SOCK_STREAM- тип сокета 
    
    if (my_socket < 0) // если получаем не 0, значит ошибка 
    {
        
        printf("Ошибка сокета %d\n", WSAGetLastError());  // !!! узнать подробней о WSAGetLastError()
        return 0; 
	}

	//Устанавлеваем соединение, не до конца понял как это работает 
	sockaddr_in local_addr;          //один из вариантов local_addr либо dest_addr. !!!выяснить подробности
    local_addr.sin_family = AF_INET;   // соединение 
    local_addr.sin_port = htons(PORT); // порт через которые должно соеденять 
    local_addr.sin_addr.s_addr = 0;    // хост, возможно надо будет заменить на HOSTENT *host;

	//================================================//
   //??? Тут видемо должна проводится работа с IP ???//
  //================================================//
	//→→→→
	//→→→→↑
//=================================================

	if (listen(my_socket, 0x100))
    {
        
        printf("Ошибка подключеня %d\n", WSAGetLastError());
        closesocket(my_socket);
        WSACleanup();
        
    }
        
     SOCKET client_socket; 
    sockaddr_in client_addr; 
 
    int client_addr_size = sizeof(client_addr);
 
		///////////////////////////
		cout << "Ожидайте" << endl;
	// как только соединение установлино 
		cout << "Введит ваше сообщение" << endl;
	cin >> message[maxline];

}

Последний раз редактировалось stdio; 03.03.2012 в 16:24.
stdio вне форума Ответить с цитированием
Старый 03.03.2012, 23:45   #10
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

Вот что наработал за сегодня :

Код:
// fsender.cpp: определяет точку входа для консольного приложения.

#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <winsock.h> 
#include <windows.h>
 
#define SERVERADDR "127.0.0.1"
#define PORT 777 
#define maxline 1000

DWORD WINAPI SexToClient(LPVOID client_socket);                // прототип функции, обслуживающий подключившихся пользователей
using namespace std;

int main()
{
	setlocale(LC_CTYPE,"Russian");
	char buff[1024];    
	//char message[maxline];
	char s;
	cout << "Для соединения нажмите 'S' и Enter" << endl;
	cin >> s;
	if(s='s')
	                                       	//WSAStartup(Ver, lpWSAData)- для работы с библиотекой
		if (WSAStartup(0x0202, (WSADATA *)&buff[0])) 
    {
        printf("Error WSAStartup %d\n", WSAGetLastError());
		return -1;
  
		SOCKET my_socket;   
		my_socket=socket ( AF_INET, SOCK_STREAM, 0 );                        
    
    if ((my_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    {
        
        printf("Ошибка WSAGetLastError() %d\n", WSAGetLastError());         
        WSACleanup();                                                         
        return -1;
	} 
	sockaddr_in local_addr;   
    local_addr.sin_family = AF_INET;                                                
    local_addr.sin_port = htons(PORT);                                             
    local_addr.sin_addr.s_addr = 0;                                               

	                                             

    if (bind(my_socket, (sockaddr *)&local_addr, sizeof(local_addr)))
    {
        
        printf("Error bind %d\n", WSAGetLastError());
        closesocket(my_socket); 
        WSACleanup(); 
        return -1;
    }


    if (listen(my_socket, 0x100))
    {
        printf("Error listen %d\n", WSAGetLastError());
        closesocket(my_socket); 
        WSACleanup(); 
        return -1;
    }


	cout << "Ожидайте" << endl;
    SOCKET client_socket;  
    sockaddr_in client_addr; 
 
    int client_addr_size = sizeof(client_addr);

    while ((client_socket = accept(my_socket, (sockaddr *)&client_addr, \
           &client_addr_size)))
	{
 
        HOSTENT *hst;
        hst = gethostbyaddr((char *)&client_addr. sin_addr.s_addr, 4, AF_INET);
 
 
        DWORD thID;
        CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
    }
    return 0;
}

DWORD WINAPI SexToClient(LPVOID client_socket)
{
    SOCKET my_sock;
    my_sock = ((SOCKET *)client_socket)[0];
    char buff[20 * 1024];
    #define sHELLO "SOCKET PODKLUCHEN\r\n"
 
    
    send(my_sock, sHELLO, sizeof(sHELLO), 0);
 
    int bytes_recv;
    while ((bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) &&
    bytes_recv != SOCKET_ERROR)
    send(my_sock, &buff[0], bytes_recv, 0);
 
    printf("-disconnect\n");                 
    closesocket(my_sock);  
    return 0;
}

Последний раз редактировалось stdio; 03.03.2012 в 23:56.
stdio вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Корпоративная система обмена сообщениями Dimka55 C# (си шарп) 1 29.11.2011 11:14
алгоритм для обмена сообщениями bammm PHP 13 02.03.2011 18:26
Вопрос о способе обмена сообщениями Beyounder Общие вопросы .NET 2 02.08.2009 00:40
Delphi. Консольное приложение для работы с txt. файлом MexX Помощь студентам 1 13.05.2009 09:37
Простой клиент обмена сообщениями eks-s Работа с сетью в Delphi 1 04.03.2008 01:03