Тупой вопрос: Я переношу прогу из линуха на винду (cygwin). Прога в линуксе общается с устройствами: /dev/netlock и /dev/fxchannel Эти устройства она сама создает. В винде она нормально компилируется, а вот с запуском проблема. Что-то про права ругается... ВОПРОС :как в винде программировать устройства типа СОКЕТ и ТРУБА?
=) рип про пайпы из мсднки, про сокеты тоже тамже можно найти Код (Text): #include <windows.h> #include <stdio.h> #define BUFSIZE 4096 VOID InstanceThread(LPVOID); VOID GetAnswerToRequest(LPTSTR, LPTSTR, LPDWORD); DWORD main(VOID) { BOOL fConnected; DWORD dwThreadId; HANDLE hPipe, hThread; LPTSTR lpszPipename = "\\\\.\\pipe\\mynamedpipe"; // The main loop creates an instance of the named pipe and // then waits for a client to connect to it. When the client // connects, a thread is created to handle communications // with that client, and the loop is repeated. for (;;) { hPipe = CreateNamedPipe( lpszPipename, // pipe name PIPE_ACCESS_DUPLEX, // read/write access PIPE_TYPE_MESSAGE | // message type pipe PIPE_READMODE_MESSAGE | // message-read mode PIPE_WAIT, // blocking mode PIPE_UNLIMITED_INSTANCES, // max. instances BUFSIZE, // output buffer size BUFSIZE, // input buffer size NMPWAIT_USE_DEFAULT_WAIT, // client time-out NULL); // no security attribute if (hPipe == INVALID_HANDLE_VALUE) { printf("CreatePipe failed"); return 0; } // Wait for the client to connect; if it succeeds, // the function returns a nonzero value. If the function returns // zero, GetLastError returns ERROR_PIPE_CONNECTED. fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); if (fConnected) { // Create a thread for this client. hThread = CreateThread( NULL, // no security attribute 0, // default stack size (LPTHREAD_START_ROUTINE) InstanceThread, (LPVOID) hPipe, // thread parameter 0, // not suspended &dwThreadId); // returns thread ID if (hThread == NULL) { printf("CreateThread failed"); return 0; } else CloseHandle(hThread); } else // The client could not connect, so close the pipe. CloseHandle(hPipe); } return 1; } VOID InstanceThread(LPVOID lpvParam) { CHAR chRequest[BUFSIZE]; CHAR chReply[BUFSIZE]; DWORD cbBytesRead, cbReplyBytes, cbWritten; BOOL fSuccess; HANDLE hPipe; // The thread's parameter is a handle to a pipe instance. hPipe = (HANDLE) lpvParam; while (1) { // Read client requests from the pipe. fSuccess = ReadFile( hPipe, // handle to pipe chRequest, // buffer to receive data BUFSIZE, // size of buffer &cbBytesRead, // number of bytes read NULL); // not overlapped I/O if (! fSuccess || cbBytesRead == 0) break; GetAnswerToRequest(chRequest, chReply, &cbReplyBytes); // Write the reply to the pipe. fSuccess = WriteFile( hPipe, // handle to pipe chReply, // buffer to write from cbReplyBytes, // number of bytes to write &cbWritten, // number of bytes written NULL); // not overlapped I/O if (! fSuccess || cbReplyBytes != cbWritten) break; } // Flush the pipe to allow the client to read the pipe's contents // before disconnecting. Then disconnect the pipe, and close the // handle to this pipe instance. FlushFileBuffers(hPipe); DisconnectNamedPipe(hPipe); CloseHandle(hPipe); } VOID GetAnswerToRequest(LPTSTR chRequest, LPTSTR chReply, LPDWORD pchBytes) { printf( "%s\n", chRequest ); lstrcpy( chReply, "default answer from server" ); *pcbBytes = lstrlen(chReply); }
lapslap Спасибо. Про МСДН забыл... щас буду копать. P.S.: Если проштудировать этот код, можно вместо тредов - форкать. Тогда более понятнее станет
Нарыл инфу... читаю. А вот интересно, если я захочу драйвер сетевого устройства написать, то в windows на си ведь его не напишешь - это не UNIX.... Есть ли более понятная документация по работе с ядром Win32 (только не MSDN)? Я в винде начинающий - для меня пока это сложно. С драйвером в Unix - все нормально (есть куча примеров на си и фпсме), а вот c win32-проблема. censored Это какой-то особый вид URI?
Интересно, есть ли фундаментальные алгоритмы для работы с трубами, сокетами, блоками и char девайсами? Ну то есть чтоб это работало не зависимо от системы операционной. Типа написал устройство один раз а запустил в любой ОС.