Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 21

Удаленное подключение к серверу по сокетам (UNIX)

05.09.2012, 17:59. Показов 3078. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день..
На одном ПК стоит Mandriva 9 (он выступает в роли сервера)
На другом ПК стоит Fedora 13 (он выступает в роли клиента)

Связь осуществляется по сокетам. Мне надо всего лишь добиться пересылки сообщений от клиента к серверу..

Привожу коды сервера и клиента соответственно:

Код сервера:
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
#ifdef WIN32
 #include <process.h>
 #include <windows.h>
 #include <winsock.h>
#endif
 
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <semaphore.h>
 
//***Вывод в file:******
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
//**********************
 
 
 
char message[]="err\n";
 
int main()
{
 
int sock, listener;
    int socket_name_size;
    int bytes_read;
 
    char buff[1024];
    struct sockaddr_in addr;
 
    printf("socket initialized\n");
 
    listener=socket(AF_INET,SOCK_STREAM,0); //create socket
    printf("socket created\n");
 
    addr.sin_family=AF_INET;
    addr.sin_port=htons(3000);  //number port
    addr.sin_addr.s_addr=htonl(INADDR_ANY);
    socket_name_size=sizeof(addr);
    //printf(htonl(INADDR_ANY));
    if(bind(listener,(struct sockaddr *)&addr,socket_name_size)<0)  //sozdanie adresa socketa
    {
        printf("socket not binding\n");
        return 1;
    }
    printf("socket bind\n");
 
    listen(listener,1);
    printf("set listen\n");
 
    int error;
    while(1)
    {
        sock=accept(listener,NULL,NULL);
        if(sock<0)
        {
            printf("accept error\n");
            //error=WSAGetLastError();
            printf("\n");
            //_getch();
            return 1;
        }
        int i=0;
    for(i=0;i<3;i++)
    {
        bytes_read=recv(sock,buff,1024,0);
        if(bytes_read<0)
        {
            break;
        }
        int out;
        out = open("/home/vxuser/my_sock/file.out", O_WRONLY|O_APPEND, S_IRUSR|S_IWUSR);
        write(out,"\n",1);
        //printf("\n");
        //a[i]=atoi(buff);
        write(out,"mess: ", 6);
        //printf("mess: ");
        write(out,buff,bytes_read);
        //printf(buff);
        write(out,"\n",1);
        //printf("\n");
    }
 
    }
 
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
#ifdef WIN32
 #include <process.h>
 #include <windows.h>
 #include <winsock.h>
#endif
 
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
#include <math.h>
 #include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <semaphore.h>
 
int main()
{
 
    struct sockaddr_in addr,serv_addr;
 
    printf("socket initialized\n");
    int sock;
    sock=socket(AF_INET,SOCK_STREAM,0);
    if(sock==-1)
    {
        printf("socket not created\n");
    }
 
    addr.sin_addr.s_addr=inet_addr("192.168.67.204");
    bind(sock,(struct sockaddr *)&addr,sizeof(addr));
    printf("bind\n");
 
    serv_addr.sin_family=AF_INET;
 
    serv_addr.sin_port=htons(3000);
 
    int error;
    if(connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
    {
        printf("connect error\n");
        //error=WSAGetLastError();
        printf("\n");
        //getch();
        return 1;
    }
    printf("connect success\n");
 
 
char message1[10]="baget1";
char message2[10]="baget2";
char message3[10]="baget3";
 
char buff[15];
 
printf("insert value\n");
printf("send mess\n");
 
    send(sock,message1,sizeof(message1),0);
    send(sock,message2,sizeof(message2),0);
    send(sock,message3,sizeof(message3),0);
 
    return 0;
 
}
IP-адрес сервера: 192.168.67.204...
IP-адрес клиента: 192.168.67.202... (если надо)

Запускаю сервер, запускаю клиента, пишет, что "connect error"...

Если делать это на одной машине, то все работает и сообщения передаются...

Подскажите, пожалуйста в чем может быть причина? Я думаю, что может нужно какие-то права на ПК сервера задать, чтобы другие ПК могли отправлять сообщения....

Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.09.2012, 17:59
Ответы с готовыми решениями:

Подключение к серверу через удалённое подключение к рабочему столу из интернета
Поставил Windows Server 2016 на машину. запустил. Создал пользователей. Разрешил подключение к рабочему столу пользователям и вообще....

Удаленное подключение ПК к серверу
Доброго времени суток. Имеется сервер на Windows 2008. У него куча рабочих мест по локальной сети. Есть сервер на FreeBSD, который не дает...

Удаленное подключение к серверу
Пытаюсь подключится к серверу через sqlplus выпадает ошибка tnsping проходит Самое интересное что на клиентской...

8
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
05.09.2012, 19:56
А в errno посмотреть? Кстати, зачем перед connect bind?
0
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 21
05.09.2012, 19:59  [ТС]
>А в errno посмотреть?
Как посмотреть содержимое "errno"?

>Кстати, зачем перед connect bind?
Не знаю, так было в примере, который я собственно говоря и реализовал..
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
05.09.2012, 20:09
man errno
0
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 21
06.09.2012, 08:27  [ТС]
errno равен 110 (превышено время ожидания)
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.09.2012, 08:39
Сервер слушает? (listen() проходит без ошибки и процесс видно по netstat -a)
Тестовые машины в одной сети?
Порт в iptables не закрыт?
0
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 21
06.09.2012, 09:50  [ТС]
listen без ошибок, в netstat нету названия сервера... в ps -a есть название сервера..
никакие айпи никто не запрещал..
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.09.2012, 11:23
Цитата Сообщение от ramnek Посмотреть сообщение
listen без ошибок, в netstat нету названия сервера...
Ну а порт то слушают?
tcp 0 0 *.37 *.* LISTEN
tcp 0 0 *.13 *.* LISTEN
tcp 0 0 *.113 *.* LISTEN
tcp 0 0 192.168.0.1.21 *.* LISTEN
tcp 0 0 127.0.0.1.8021 *.* LISTEN
tcp 0 0 192.168.0.1.25 *.* LISTEN
tcp 0 0 *.22 *.* LISTEN
tcp 0 0 *.2049 *.* LISTEN
tcp 0 0 *.635 *.* LISTEN
tcp 0 0 127.0.0.1.111 *.* LISTEN

Цитата Сообщение от ramnek Посмотреть сообщение
никакие айпи никто не запрещал..
Код жуткий, но должен работать...
Давайте что-ли tcpdump -ni интерфейс_с_которого_придет_клиент tcp and port 3000 посмотрим?
0
 Аватар для RRA
1 / 1 / 2
Регистрация: 21.07.2009
Сообщений: 19
18.09.2012, 14:25
Печальный код если не сказать более (((( Никаких проверок практически нет!!!
Вот маленькое направление
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
/* запускаем сервер */
int startserv(const int type)
{
    struct sockaddr_in peer; /* объявляем клиента  */
    int s, ss, su;
    int rc; /* потоковый дескриптор */
    int peerlen = sizeof(peer);
    FILE *fp; /* создаем указатель на поток */
 
    pthread_t pt;
    pthread_attr_t attr;
 
    struct sockarg *ptr;
    ptr = (struct sockarg*)malloc(sizeof(struct sockarg)); /* выделяем память для структуры */
 
    pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
 
    ptr->userAgent = "user";
 
    switch (type)
    {
        case TCP:
            s = servtcp(NULL, "9999");
            while (1)
            {
                ss = accept(s, (struct sockaddr*)&peer, &peerlen);
                ptr->socket = ss;
                rc = pthread_create(&pt, NULL, getdata, (void*)ptr);
                if (rc)
                {
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }   
            }       
            pthread_join(pt, NULL);
            break;
        case UDP:
/*........*/
 
void addr(char *host, char *port, struct sockaddr_in *srvaddr, char *type)
{
    struct servent *sp;
    struct hostent *hp;
    char *endptr;
    int short lport;
    /* обнуляем структуру srvaddr */
    bzero(srvaddr, sizeof(*srvaddr));
    /* записываем в поле адресное пространство */
    srvaddr->sin_family = PF_INET;
    if (host != NULL)
    {
        if (!inet_aton(host, &srvaddr->sin_addr))
        {
            if ((hp = gethostbyname(host)) == NULL)
                printf("error");
            srvaddr->sin_addr = *(struct in_addr*)hp->h_addr;
        }
    }
    else
        srvaddr->sin_addr.s_addr = htonl(INADDR_ANY);
    lport = strtol(port, &endptr, 0);
    if (*endptr == '\0')
        srvaddr->sin_port = htons(lport);
    else
    {
        if ((sp = getservbyname(port, type)) == NULL)
            printf("error");
        srvaddr->sin_port = sp->s_port;
    }
}
 
/* создаем сокет для работы по TCP соединению */
static int servtcp(char *host, char *port)
{
/*  объявляем переменную serv типа sockaddr_in для записи в поля сведений о хосте*/
    struct sockaddr_in serv;    
    int s; /* дескриптор сокета */
    const int on;
    addr(host, port, &serv, "tcp");
    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
        printf("error for creat socket"); /*shodialog(Gtk......) */
    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on)))
        printf("error for setsockopt"); /*shodialog(Gtk......) */
    if ((bind(s, (struct sockaddr*)&serv, sizeof(serv))) < 0)
        printf("errorfor bind"); /*shodialog(Gtk......) */
    if (listen(s, 5))
        printf("error or listen"); /*shodialog(Gtk......) */
    return s;
}
Нужно сперва проверять сервер telnet'ом c удаленки - если не получается правим сервер. Если все хорошо, пробуем или правим клиента.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2012, 14:25
Помогаю со студенческими работами здесь

Удаленное подключение к терминальному серверу
Коллеги Хай! Голову сижу ломаю. Есть АплМак на нём установлена версия Sierra. С этого АплМака подключаются по VPN к сети организаций,...

Как организовать удаленное подключение к серверу?
Добрый день! Есть небольшой сервер на Win Server 2012. На сервере есть несколько пользователей. Как можно подключиться при помощи...

Удаленное подключение к серверу через http
Не как не могу найти информацию о том, как сделать что бы приложение обращалась к серверу по заданному http адресу и что бы все данные...

Удаленное подключение к OPC серверу (работа с DCOM)
У меня появилась такая проблема: есть OPC сервер, работает на операционной системе Windows XP SP2. Подключение и доступ к тэгам на...

Ищу работу. Предлагаю удаленное администрирование,аудит unix,linux,network,voip,security
Предлагаю удаленный аудит, настройку, оптимизацю, администрирование и организацию информационной защиты инфраструктур...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru