HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 15.09.2008, 12:22
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

если я правильно понял, то алгоритм таков тебе нужен:
accept - возвращает тебе сокет для работы с присоединившимся человеком.
затем ты запускаешь потом через CreateThread и передешь функции обработки этот самый дискриптор. И далее заново циклом на accept.
А функция которая работает в потоке - там делаешь свои дела юзая переданный в параметрах дискриптор.
 
Ответить с цитированием

  #2  
Старый 15.09.2008, 18:45
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Цитата:
Сообщение от slesh  
если я правильно понял, то алгоритм таков тебе нужен:
accept - возвращает тебе сокет для работы с присоединившимся человеком.
затем ты запускаешь потом через CreateThread и передешь функции обработки этот самый дискриптор. И далее заново циклом на accept.
А функция которая работает в потоке - там делаешь свои дела юзая переданный в параметрах дискриптор.
Я немного непонял.Каким образом передавать сокет для работы с клиентом в поток?Путем обьявления промежуточной переменной типа SOCKET и передачи уже её в поток?А что с ней тогда делать после завершения потока,через ZeroMemory очищять?А смысл тогда создавать поток ,если серверное преложение не имеет гуи?
 
Ответить с цитированием

  #3  
Старый 15.09.2008, 13:36
Zakary
Участник форума
Регистрация: 28.09.2005
Сообщений: 180
Провел на форуме:
749734

Репутация: 34
По умолчанию

эээ...вообще для первоклассников вопрос
есть int x,y поменять местами значение x,y. если возможно без ввода дополнительных переменных, если нельзя, то ввести новые переменные.

тут два слова ответ..но какой?
 
Ответить с цитированием

  #4  
Старый 15.09.2008, 17:41
Ryuzavi
Новичок
Регистрация: 10.09.2008
Сообщений: 10
Провел на форуме:
158657

Репутация: 26
По умолчанию

Цитата:
Сообщение от Zakary  
есть int x,y поменять местами значение x,y. если возможно без ввода дополнительных переменных
Ещё можно используя оператор xor (исключающая дизъюнцция).
Код:
  a:=a xor b;
  b:=a xor b;
  a:=a xor b;
То же на асме:
Код:
int x=12;
int y=7;
__asm
{
  mov eax,x
  xchg eax,y
  mov x,eax
}
 
Ответить с цитированием

  #5  
Старый 15.09.2008, 14:37
iv.
Moderator - Level 7
Регистрация: 21.03.2007
Сообщений: 1,200
Провел на форуме:
7134052

Репутация: 1204


По умолчанию

Цитата:
есть int x,y поменять местами значение x,y. если возможно без ввода дополнительных переменных, если нельзя, то ввести новые переменные.
x = x + y;
y = x - y;
x = y - x;

как-то так =\

__________

как-то не так =\

Последний раз редактировалось iv.; 15.09.2008 в 14:54..
 
Ответить с цитированием

  #6  
Старый 15.09.2008, 14:42
SpangeBoB
Moderator - Level 7
Регистрация: 12.07.2008
Сообщений: 1,705
Провел на форуме:
5914048

Репутация: 1350


По умолчанию

Только последнее действие x-y
 
Ответить с цитированием

Хелп!!!
  #7  
Старый 15.09.2008, 15:38
agrofyl2
Познающий
Регистрация: 25.04.2008
Сообщений: 51
Провел на форуме:
146826

Репутация: 17
Question Хелп!!!

Помогите плиз!

Как считывать данные из сокета построчно??

На ум приходит
1. Записать в файл и считывать fgets() (явно извращение)
2. Писать свою функцию(слишком геморно)

Последний раз редактировалось agrofyl2; 15.09.2008 в 15:43..
 
Ответить с цитированием

  #8  
Старый 15.09.2008, 15:56
Zakary
Участник форума
Регистрация: 28.09.2005
Сообщений: 180
Провел на форуме:
749734

Репутация: 34
По умолчанию

с дополнительным интегером придумал
z=y-x;
x=x+z;
y=y-z;
а как без него?
 
Ответить с цитированием

  #9  
Старый 15.09.2008, 19:03
agrofyl2
Познающий
Регистрация: 25.04.2008
Сообщений: 51
Провел на форуме:
146826

Репутация: 17
По умолчанию

_nic: вот код из Фленова
Код:
// TCPServer.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <winsock2.h>
#include "TCPServer.h"
#define MAX_LOADSTRING 100

#pragma comment( lib, "ws2_32.lib" )

// Global Variables:
HINSTANCE hInst;								// current instance
TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name

// Forward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

DWORD WINAPI ClientThread(LPVOID lpParam)
{
    SOCKET        sock=(SOCKET)lpParam;
    char          szRecvBuff[1024],
				  szSendBuff[1024];
    int           ret;

    while(1)
    {
        ret = recv(sock, szRecvBuff, 1024, 0);
        if (ret == 0)
            break;
        else if (ret == SOCKET_ERROR)
        {
			MessageBox(0, "Recive data filed", "Error", 0);
            break;
        }
        szRecvBuff[ret] = '\0';

	strcpy(szSendBuff, "Command get OK");

        ret = send(sock, szSendBuff, sizeof(szSendBuff), 0);
        if (ret == SOCKET_ERROR)
        {
           break;
        }
    }
    return 0;
}

DWORD WINAPI NetThread(LPVOID lpParam)
{
    SOCKET        sServerListen,
                  sClient;
    struct sockaddr_in localaddr,
                       clientaddr;
    HANDLE        hThread;
    DWORD         dwThreadId;
    int           iSize;

	sServerListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if (sServerListen == SOCKET_ERROR)
    {
		MessageBox(0, "Can't load WinSock", "Error", 0);
        return 0;
    }
    localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(5050);

    if (bind(sServerListen, (struct sockaddr *)&localaddr, 
            sizeof(localaddr)) == SOCKET_ERROR)
    {
		MessageBox(0, "Can't bind", "Error", 0);
        return 1;
    }
    
    MessageBox(0, "Bind OK", "Error", 0);

    listen(sServerListen, 4);

    MessageBox(0, "Listen OK", "Error", 0);
    while (1)
    {
        iSize = sizeof(clientaddr);
        sClient = accept(sServerListen, (struct sockaddr *)&clientaddr,
                        &iSize);        
        if (sClient == INVALID_SOCKET)
        {        
			MessageBox(0, "Accept filed", "Error", 0);
            break;
        }

        hThread = CreateThread(NULL, 0, ClientThread, 
                    (LPVOID)sClient, 0, &dwThreadId);
        if (hThread == NULL)
        {
			MessageBox(0, "Create thread filed", "Error", 0);
            break;
        }
        CloseHandle(hThread);
    }
    closesocket(sServerListen);
    return 0;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	MSG msg;
	HACCEL hAccelTable;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_TCPSERVER, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TCPSERVER);

    WSADATA       wsd;
    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
	{
		MessageBox(0, "Can't load WinSock", "Error", 0);
		return 0;
	}

    HANDLE        hNetThread;
    DWORD         dwNetThreadId;
	hNetThread = CreateThread(NULL, 0, NetThread, 
                    0, 0, &dwNetThreadId);

	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
    }
    
    WSACleanup();

	return (int) msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_TCPSERVER);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= (LPCTSTR)IDC_TCPSERVER;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

	return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND	- process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message) 
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam); 
		wmEvent = HIWORD(wParam); 
		// Parse the menu selections:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// Message handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		return TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
		{
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}
		break;
	}
	return FALSE;
}
 
Ответить с цитированием

  #10  
Старый 15.09.2008, 23:46
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

И все равно я непонимаю как освободить Sockaddr_in остающиюся после инициализации клиентского сокета.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Сценарии/CMF/СMS 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ