отсылка пакетов

  • Автор теми Cris
  • Дата створення

Cris

Member
люди а как например в Си++ можно открыть порт, и ловить пакеты, допустим надо написать сервак на с++, его запускаеш он открывает порт,и переходит в режим ожидания , и потом в любое время на этот порт отправляються пакеты, сервак должен их принять и отправить ответ откуда прибыли пакеты,
как это можна реализовать на с++, Борланд с++
 

setty

Граф
под винды:
инициализируешь WinSock - WSAStartup
создаешь сокет через SOCKET hSocket = socket(...)
биндишь его на порт через bind(hSocket, ...)
затем переводишь в состояние прослушивания - listen(hSocket, ...)

ожидаешь подключение клиента через accept(...)

освобождаешь WinSock - WSACleacnup(...)

это вобщем, описания функций - см. MSDN
если нужно могу нарыть парочку примеров на сях.
 

setty

Граф
ну вот наспех собрал примерный код:
Код:
#include <windows.h>
#include "tchar.h"

#define _PORT_ 999		//port to listen to
#define	_MAXCON_ 1		//max parallel connections allowed (0 mean 1 connection)
#define _MAXCOMMAND_ 50

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,	int nCmdShow)
{	WSADATA wsaData;
	sockaddr_in saddr;
	DWORD var;
	char	buffer[_MAXCOMMAND_];			//command length must be les than this value
	if(WSAStartup( MAKEWORD(2,2), &wsaData ))	return 0;
	SOCKET hSocket = socket(AF_INET, SOCK_STREAM, NULL);
	if ( hSocket == INVALID_SOCKET )
	{	WSACleanup();
		return false;
	}
	saddr.sin_family = AF_INET;
	saddr.sin_addr.s_addr = INADDR_ANY;
	saddr.sin_port = htons( _PORT_ );
	if (bind( hSocket, (SOCKADDR*) &saddr, sizeof(sockaddr_in)))
	{	closesocket(hSocket);
		WSACleanup();
		return false;
	}
	if ( listen( hSocket, _MAXCON_ ))
	{	closesocket(hSocket);
		WSACleanup();
		return false;
	}
	MessageBox(0, _T("Server started!"), _T("Server message:"), MB_OK);
	while (1)
	{	SOCKET AcceptSocket = accept( hSocket, NULL, NULL );
		send(AcceptSocket,"Hi, i was waiting for u!\n\r-----------------------\n\r!", 51*sizeof(char) , 0);
		while (AcceptSocket)
		{	if (recv(AcceptSocket, buffer, _MAXCOMMAND_, 0))
				send(AcceptSocket," :--> I see you )\r\n", 19*sizeof(char) , 0);
			Sleep(1000);
			ZeroMemory(buffer, sizeof(buffer));
		}
	}


	return true;
}
Проэкт должен быть должно быть слинкован с библиотекой ws3_32.lib.
Тут создается прослушиваший сокет, который ожидает соединения. Одновременно работает с одним соединением, если одно соединение закрыто - ожидает открытие нового. В ответ на полученные данные отсылает фразу "I see you )". Следует отметить что в реальном коде вам, вероятней всего прийдется организовать анализатор входных данных. Вы можете запустить эту прогамму и зателнетится туда (как видно из исходника она ожидает соединения на 999м порту следовательно для примера можно попробовать что то вроде telnet 127.0.0.1 999). Телнет отсылает данные как только они появляются в буфере, так что если на эту демонстрационную программу ктото зайдет через телнет то данные эта программа будет получать не тогда когда пользователь нажмет ентер, а каждый раз когда он вообще что либо нажимает. Следовательно если вы хотите анализировать данные, вы должны собирать строку до тех пор пока не встретится символ возрата картеки. Впрочем это уже ньюансы.

Так же в более сложном случае вам вероятно таки прийдется запускать цикл приема данных в отдельном потоке, чтоб основной поток процесса был свободен для выполнения других действий.
 

Cris

Member
ну вот наспех собрал примерный код:

Проэкт должен быть должно быть слинкован с библиотекой ws3_32.lib.
а так вопшем большое спасибо, терь хоть представление имею, и всетаки я так и непонял как отправлять на сервер через телнет чтолибо, может хтото покажет учебник по скринам)) или дайте ссылку винете, и команда в телнете SEND,sen,SEN,send(все пробывал) - пишет что незнает такую команду хотя в хелпе написано что такая есть


тыб библиотеку немог выложить, или показать де ее мона скачать, а то в гугл на ходит 5 китайских ссылок и все)
 
Останнє редагування:

setty

Граф
тыб библиотеку немог выложить, или показать де ее мона скачать, а то в гугл на ходит 5 китайских ссылок и все)
это стандартное либко...
оно входит с пакет MSVS2005 на котором разработан пример.
Другие пакеты тоже должны предоставлять подобные библиотеки для работы с winsock.

Подрузить либку в MSVS2005 можно так:
project/proporties/configuration proporties/linker/Command line/
вот картинка...

а касательно команд телнета, то, кхм..., он какбы не имеет никаких команд. Что введешь то и отправит. Все таки почитай о нем гденибудь.
 
Останнє редагування:
Зверху