Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сервер/Клиент

6.8K
21 мая 2010 года
bolt90
80 / / 25.01.2007
Здавствуйте. У меня такая проблема. Есть сервер при конекте к которому он запускает приложение, с перенаправленными потоками на подключившигося клиента. Проблема в том, что если в программе только вывод через printf() то у клиента все путем отображается, а если я хочу добавить ввод от клиента через scanf(), то просто пустое окошко телнета.

Код сервера
Код:
#pragma hdrstop
#include <tchar.h>
#pragma argsused

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#pragma comment(lib,"ws2_32.lib")

DWORD WINAPI ClientThread(LPVOID lpParam) {
    SOCKET hSocket = (SOCKET)lpParam;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.hStdInput = si.hStdOutput = si.hStdError = (void*)hSocket;
    CreateProcess("client1.exe", 0, NULL, NULL, 0, NULL, NULL,
        NULL, &si, &pi);
    return 0;
}

DWORD WINAPI NetThread() {
    SOCKET sServerListen, sClient;
    char text[22] = {
        0
    };
    unsigned long ip;
    unsigned short port;
    struct sockaddr_in localaddr, clientaddr;
    HANDLE hThread;
    DWORD dwThreadId;
    int iSize;
    sServerListen = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, 0);
    if (sServerListen == SOCKET_ERROR) {
        MessageBox(0, "Can't create socket", "Error", 0);
        return 0;
    }
    localaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(8080);
    if (bind(sServerListen, (struct sockaddr*) & localaddr,
            sizeof(localaddr)) == SOCKET_ERROR) {
        MessageBox(0, "Can't bind", "Error", 0);
        return 1;
    }
    listen(sServerListen, 5);
    while (1) {
        iSize = sizeof(clientaddr);
        sClient = accept(sServerListen, (struct sockaddr*) & clientaddr,
            &iSize);
        if (sClient == INVALID_SOCKET) {
            MessageBox(0, "Accept filed", "Error", 0);
            break;
        }
        WSANtohl(sClient, clientaddr.sin_addr.S_un.S_addr, &ip);
        WSANtohs(sClient, clientaddr.sin_port, &port);
        sprintf(text, "Connect with client %d.%d.%d.%d:%hd",
            (ip & 0xFF000000) >> 24, (ip & 0xFF0000) >> 16,
            (ip & 0xFF00) >> 8, ip & 0xFF, port);
        printf("%s\n", text);
        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 _tmain(int argc, _TCHAR* argv[]) {
    WSADATA wsd;
    char host[128];
    struct hostent* ip;
    // char ip[255];
    if (WSAStartup(MAKEWORD(2, 2), &wsd)) {
        MessageBox(0, "Can't load WinSock2", "Error", 0);
        return 0;
    }
    gethostname(host, sizeof(host));
    ip = gethostbyname(host);
    printf("Start server on Host %s (%d.%d.%d.%d): Listening port 8080...\n", host,
        (int)(ip->h_addr_list[0][0] & 0xFF),
        (int)(ip->h_addr_list[0][1] & 0xFF),
        (int)(ip->h_addr_list[0][2] & 0xFF),
        (int)(ip->h_addr_list[0][3] & 0xFF));
    NetThread();
    WSACleanup();
    return 0;
}


Код программы
Код:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[]) {
    char lpCommand[255];
    while (1) {
        printf(">");
        scanf("%s", lpCommand);

        }
    return 0;
}
6.8K
21 мая 2010 года
bolt90
80 / / 25.01.2007
Перепробовал все функции ввода вывода которые знал, fread/fwrite,ReadConsole/WriteConsole,ReadFile/WriteFile ведут каждая себя по разному но не дает результата. Думал может из за торента тормозит вывод, еще кучу всего перепробовал. А потом нашару поставил после вывода fflush(stdout); и все запахало. ппц завтыкал
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог