0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 50
1

Сервер TCP

21.12.2013, 16:22. Показов 2551. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание: Обеспечить перемещение файла по фиксированным частям в несколько открытых соединений по сети. От клиента к серверу. Протокол взаимодействия TCP;
Код клиента:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <conio.h>
 
#ifndef UNICODE
#define UNICODE
#endif
 
#define WIN32_LEAN_AND_MEAN
#define DEFAULT_BUFLEN 512
 
using namespace std;
 
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
 
int wmain()
{
    setlocale(LC_ALL, "RU");
    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(27015);
 
    //----------------------
    // Connect to server.
    char path[MAX_PATH] = {0},
    path1[MAX_PATH] = {0};
 
    cout << "Введите путь к файлу: ";
    cin.getline (path, MAX_PATH);
 
    OemToCharA(path, path1);
    iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    wprintf(L"Connected to server.\n");
    
    iResult = send( ConnectSocket, path1, sizeof(path1), 0 );
    FILE *f;
    fopen_s(&f, path1,"rb");
    while(!feof(f))
    {
        char blockfile[524288] = {0};
        int i = fread(blockfile, sizeof(char), 524288, f);
        iResult=send(ConnectSocket, blockfile, i,0);
    }
    fclose(f);
    remove(path1);
    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
 
    WSACleanup();
    return 0;
}

Код сервера:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <locale.h>
#include <conio.h>
#ifndef UNICODE
#define UNICODE
#endif
// Need to link with Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 512
 
using namespace std;
 
typedef struct{
    char path[MAX_PATH];
    SOCKET client;
}Data;
 
 
DWORD WINAPI ThreadProc(LPVOID lpParam){
    DWORD dwResult = 0;
    Data *dat=(Data *)lpParam;
 
    int iResult;
    FILE *f;
    fopen_s(&f,dat->path,"wb");
    do
    {
        char blockfile[524288] = {0};
        iResult=recv(dat->client,blockfile,524288,0);
        fwrite(&blockfile,sizeof(char),iResult,f);
    }while(iResult>0);
    fclose(f);
 
    free(dat);
 
    return dwResult;
}
 
int wmain(void)
{
    setlocale(LC_ALL, "RU");
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;
    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = INADDR_ANY;
    service.sin_port = htons(27015);
 
    if (bind(ListenSocket,(SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) {
        wprintf(L"bind failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen(ListenSocket, 1) == SOCKET_ERROR) {
        wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Create a SOCKET for accepting incoming requests.
    SOCKET AcceptSocket;
    wprintf(L"Waiting for client to connect...\n");
 
    //----------------------
    // Accept the connection.
    char path[MAX_PATH] = {0},
    path1[MAX_PATH] = {0};
 
    cout << "Введите папку: ";
    cin.getline (path, MAX_PATH);
    HANDLE hThread;
    DWORD dwThreadId;
    
    OemToCharA(path, path1);
    
    while(1)
    {
        AcceptSocket = accept(ListenSocket, NULL, NULL);
        wprintf(L"Client connected.\n");
        if (AcceptSocket == INVALID_SOCKET) {
            wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        } else
        wprintf(L"Client connected.\n");
    
        iResult = recv(AcceptSocket, recvbuf, recvbuflen, 0);
        char tmp[MAX_PATH] = {0},tmp1[MAX_PATH] = {0}, tmp2[MAX_PATH]={0};
        _splitpath_s(recvbuf,NULL, NULL,NULL,NULL,tmp,MAX_PATH,tmp1,MAX_PATH);
        strcat_s(tmp,MAX_PATH,tmp1);
        sprintf_s(tmp2, "%s\\%s", path1, tmp);
        Data *dat=new Data();
        dat->client=AcceptSocket;
        strcpy_s(dat->path,tmp2);
        hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID*)dat, 0, &dwThreadId);
        CloseHandle(hThread);
    }
    // No longer need server socket
    closesocket(ListenSocket);
 
    WSACleanup();
    return 0;
}

Проблема в том, что файл исчезает, но не появляется в другой месте. Может кто-нибудь подскажет, что не так?
PS: сервер зависает на: AcceptSocket = accept(ListenSocket, NULL, NULL);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2013, 16:22
Ответы с готовыми решениями:

как создать TCP клиент, TCP сервер ? На С++
Очень нужна помощь!Как написать TCP клиент, TCP сервер. Например,клиент вводит строку с клавиатуры...

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include...

TCP сервер
Написал сервер на Python: from twisted.internet.protocol import Factory, Protocol from...

Tcp Сервер
Реализовать TCP-север, принимающий соединение на заданный порт. После того, как соединение...

20
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
24.12.2013, 19:48 21
Author24 — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
С какой такой стати мы должны любое целое значение трактовать как логическое?
мы можем это сделать. потому что это свойство языка о котором идет речь. не какого-нибудь, а именно этого. он может так делать. и мы знаем об этом. если мы знаем язык. в начале в нем вообще не было типа bool. истина это 1, а ложь это 0. не правда ли выглядит весьма естественно?



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Однако чем сильнее мы себя ограничим явным образом от ошибок - тем лучше будет для нас же самих.
видимо я для себя решил что у меня будет больше ошибок и путаницы если мозги при обнаружении логического выражения сравнения с константой будут обрабатывать его особым образом и выносить ее вперед - пусть лучше обрабатывают все единообразно и не вздумают делать = вместо == вне зависимости от специфики выражения

0
24.12.2013, 19:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2013, 19:48
Помогаю со студенческими работами здесь

сервер TCP/IP
нужна помощь по устранению ошибок! #include&lt;stdafx.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt;...

TCP/IP клиент и сервер
Сервер # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include...

TCP сервер и клиент
Добрый день! Необходимо реализовать TCP сервер, поддерживающий соединения с несколькими ...

TCP клиент-сервер
Всем привет! Прошу помощи в освоении организации передачи данных по TCP. Если у кого то есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru