[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. agrofyl2

    agrofyl2 New Member

    Joined:
    25 Apr 2008
    Messages:
    54
    Likes Received:
    4
    Reputations:
    0
    Хелп!!!

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

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

    На ум приходит
    1. Записать в файл и считывать fgets() (явно извращение)
    2. Писать свою функцию(слишком геморно)
     
    #1561 agrofyl2, 15 Sep 2008
    Last edited: 15 Sep 2008
  2. Zakary

    Zakary Elder - Старейшина

    Joined:
    28 Sep 2005
    Messages:
    165
    Likes Received:
    10
    Reputations:
    0
    с дополнительным интегером придумал
    z=y-x;
    x=x+z;
    y=y-z;
    а как без него?:)
     
  3. Ryuzavi

    Ryuzavi Member

    Joined:
    10 Sep 2008
    Messages:
    10
    Likes Received:
    8
    Reputations:
    0
    Ещё можно используя оператор xor (исключающая дизъюнцция).
    Code:
      a:=a xor b;
      b:=a xor b;
      a:=a xor b;
    То же на асме:
    Code:
    int x=12;
    int y=7;
    __asm
    {
      mov eax,x
      xchg eax,y
      mov x,eax
    }
    
     
  4. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я немного непонял.Каким образом передавать сокет для работы с клиентом в поток?Путем обьявления промежуточной переменной типа SOCKET и передачи уже её в поток?А что с ней тогда делать после завершения потока,через ZeroMemory очищять?А смысл тогда создавать поток ,если серверное преложение не имеет гуи?
     
  5. agrofyl2

    agrofyl2 New Member

    Joined:
    25 Apr 2008
    Messages:
    54
    Likes Received:
    4
    Reputations:
    0
    _nic: вот код из Фленова
    Code:
    // 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;
    }
    
     
  6. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    И все равно я непонимаю как освободить Sockaddr_in остающиюся после инициализации клиентского сокета.
     
  7. UnPazz

    UnPazz Elder - Старейшина

    Joined:
    30 Aug 2008
    Messages:
    95
    Likes Received:
    43
    Reputations:
    6
    подскажите, plz, как получить список названий всех файлов папке.
     
  8. Zakary

    Zakary Elder - Старейшина

    Joined:
    28 Sep 2005
    Messages:
    165
    Likes Received:
    10
    Reputations:
    0
    Ещё мелочи:
    1. скопировать значение int firstnum в int tempnum
    2. Как скопировать значение double z в ближайший integer в int x

    спасибо:)
     
  9. ToniKapuchon

    ToniKapuchon Elder - Старейшина

    Joined:
    26 Feb 2006
    Messages:
    153
    Likes Received:
    45
    Reputations:
    -1
    FindFirst() FindNext() в цикле!!
    посмотри тут http://forum.vingrad.ru/faq/topic-157851.html
     
  10. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    double d;
    int x = static_cast<int>(d);

    Делать это можно только на свой страх и риск. При больших значениях d возникает потеря значимости.
     
    #1570 4p3, 16 Sep 2008
    Last edited: 16 Sep 2008
  11. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Code:
    #include <vector>
    #include <string>
    #include <windows.h>
    
    using namespace std;
    
    vector<string> glob(const char* path) {
    	vector<string> v;
    	WIN32_FIND_DATA FindFileData;
    	HANDLE hFind;
    	string s;
    
    	hFind = FindFirstFile(path, &FindFileData);
    	do {
    		s = string(FindFileData.cFileName);
    		if (s != "." && s != "..") {
    			v.push_back(s);
    		}
    	} while (FindNextFile(hFind, &FindFileData));
    	return v;
    }
     
  12. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    хачу научиться хоть немног писать интерфесы для програм, тобишь окна кнопки и т.д. т.п.
    как создать окно уже прочитал, как кнопку тоже, но негде немогу найти чтоб описявалось подробно как обрабатывать нажатия кнопок (созданых мною) немоглибы направить меня на путь истиный...
     
  13. Jes

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    http://www.rsdn.ru/article/baseserv/api32.xml
     
  14. procedure

    procedure Elder - Старейшина

    Joined:
    22 Dec 2007
    Messages:
    527
    Likes Received:
    257
    Reputations:
    46
    Вопрос по C#. Должны ли мы вызывать деструкторы объектов вручную чтоб это не приводило к ненужным тратам памяти? Или можно довериться выполнению деструкторов по умолчанию?
     
  15. ForNeVeR

    ForNeVeR Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    67
    Likes Received:
    31
    Reputations:
    0
    procedure, если твои классы занимают много памяти и она вся нужна тебе прямо сейчас - вызывай деструктор. В остальных случаях, я думаю, можно положиться на CLR'овский сборщик мусора.
     
  16. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Нет.
    Существует сборщик мусора. При удалении объекта он САМ вызовет деструктор.
    Деструктор вызывать нельзя ни в каком случае.
    Если хочешь освободить объекты - то просто сделай так. чтобы они не нужны были твоей программе - и Gc удалит их сам.
     
  17. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    И вообще по Java и C# лучше отдельную тему завели бы.
     
  18. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Закреплена тема. Читать про Qt.
     
  19. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    спс, тут хоть было написано как нажатие левой кнопки мыши обработать ))

    ЗЫ. но все же вопрос в силе.
     
    #1579 cupper, 17 Sep 2008
    Last edited: 17 Sep 2008
  20. ForNeVeR

    ForNeVeR Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    67
    Likes Received:
    31
    Reputations:
    0
    Верно, извиняюсь, глупость сморозил. Не имел под рукой компилятора. Действительно, студийный компилер даже слова delete не знает. А раз его нет - значит, оно не нужно.
     
Thread Status:
Not open for further replies.