Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Чиффа
5 / 5 / 1
Регистрация: 24.09.2012
Сообщений: 58

Клиент-сервер, потоки,загвоздка в постоянном чтении и отправке сообщений

24.09.2012, 15:37. Показов 902. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые программисты, я пытаюсь написать программку для отправки и приёма сообщений(что-то вроде аськи), по средствам соединения сервер - клиент. Загвоздка в том чтобы и клиент и сервер могли одновременно и принимать и отправлять сообщения.
Если сможете напишите какую можно литературу почитать по программированию 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
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
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <pthread.h>
 
using namespace std;
 
char Message1[300], Message2[300];
int sock;
int Client;
 
void * wrt(void * arg);
void * rd(void * arg);
 
int main( void )
{
    char ClientName[30], PCName [30];
 
struct sockaddr_in serv; // Свойства(адрес) создаваемого сокета
gethostname(PCName, 30);
 
 
int r_bind;
int r_listen;
int r_read;
int r_write;
 
serv.sin_family = AF_INET;
serv.sin_port = htons( 7500 );
serv.sin_addr.s_addr = htonl( INADDR_ANY );
sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
 
if ( sock < 0 )
{
perror( "ошибка вызова socket" );
exit( 1 ) ;
}
 
r_bind = bind( sock, ( struct sockaddr * )&serv, sizeof( serv ) );
if ( r_bind < 0 )
{
perror( "ошибка вызова bind" );
exit( 1 );
}
//Ожидаем клиента
printf("Wait of client...\n");
 
r_listen = listen( sock, SOMAXCONN );
if ( r_listen )
{
perror( "ошибка вызова listen" );
exit (1);
}
 
Client = accept( sock, NULL , NULL );//( struct sockaddr * )&serv
if ( Client < 0 )
{
perror ( "ошибка вызова accept" );
exit( 1 );
}
 
r_read = recv( Client, ClientName, 30, 0 );
if ( r_read <= 0 )
{
perror( "ошибка вызова recv" );
exit( 1 );
}
 
r_write = send( Client, PCName , 31, 0 );
if ( r_write <= 0 )
{
perror( "ошибка вызова send" );
exit( 0 );
}
printf("Client ( \" %s \" ) has connected!\n", ClientName);
 
pthread_t thr1, thr2;
int id1 = 1;
int id2 = 2;
int result;
 
result = pthread_create(&thr1, NULL, wrt, &id1);
result = pthread_create(&thr2, NULL, rd, &id2);
 
result = pthread_join(thr1, NULL);
result = pthread_join(thr2, NULL);
 
    // Закрытие сокетов и окончание работы
    shutdown(sock, 0);
    close(sock);
    close(Client);
    getchar();
    return 0;
}
 
void * wrt(void * arg)
{
    while(true)
    {
        scanf("%299s",Message1);
        if (send(Client, Message1, 301, 0) != 'q')
            printf("Sent!\n");
        else printf("Error of sending!\n");
    }
}
void * rd(void * arg)
{
    while(true)
    {
        if (recv(Client, Message2, 300, 0) != 'q')
        {
            printf("\nreading:\t%s\n", Message2);
            getchar();
        }
        else printf("Error of reading!\n");
    }
}
и код клиента:
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
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <pthread.h>
 
using namespace std;
 
char Message1[300],Message2[300];
 int sock;
void * wrt(void * arg);
void * rd(void * arg);
 
int main( void )
{
    char PCName[30], ServerName[30], IP[16] = { 0 };
 struct sockaddr_in clien;
 int r_connect;
 int r_read;
 int r_write;
 
  //Ввод IP-адреса сервера
    printf("Enter server's IP: ");
    scanf("%15s", IP);
 
    gethostname(PCName, 30); // Получение имени текущего ПК
 
 clien.sin_family = AF_INET;
 clien.sin_port = htons( 7500 );
 clien.sin_addr.s_addr = inet_addr( IP );
 
 sock = socket( AF_INET, SOCK_STREAM, 0 );
 if ( sock < 0 )
 {
 perror( "ошибка вызова socket" );
 exit( 1 );
 }
 
 //Подключение к серверу
 printf("connecting to server...\n");
 
 r_connect = connect( sock, ( struct sockaddr *)&clien, sizeof( clien ) );
 if ( r_connect )
 {
 perror( "ошибка вызова connect" );
 exit( 1 );
 }
 
 r_write = send(sock, PCName, 31, 0 );
 if ( r_write <= 0 )
 {
 perror( "ошибка вызова send" );
 exit( 1 );
 }
 
 r_read = recv(sock, ServerName, 30, 0);
 if ( r_read <= 0 )
 perror( "ошибка вызова recv" );
 
 printf("connect to \" %s \" \n", ServerName);
 
 pthread_t thr1, thr2;
 int id1 = 1;
 int id2 = 2;
 int result;
 
 result = pthread_create(&thr1, NULL, wrt, &id1);
 result = pthread_create(&thr2, NULL, rd, &id2);
 
 result = pthread_join(thr1, NULL);
 result = pthread_join(thr2, NULL);
    // Закрытие сокетов и окончание работы с WinSock
 shutdown(sock, 0);
 close(sock);
 getchar();
 return 0;
 }
 
void * wrt(void * arg)
{
    while(true)
    {
        scanf("%299s",Message1);
        if (send(sock, Message1, 301, 0) != 'q')
            printf("Sent!\n");
        else printf("Error of sending!\n");
    }
 
}
void * rd(void * arg)
{
    while(true)
    {
        if (recv(sock, Message2, 300, 0) != 'q')
        {
            printf("\nreading:\t%s\n", Message2);
            getchar();
        }
        else printf("Error of reading!\n");
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2012, 15:37
Ответы с готовыми решениями:

Клиент-серверное приложение перстает работать при отправке/приеме 3-4 сообщений
Здравствуйте! При создании сервера (пока он ещё на начальном этапе и я сделал только самое простое) у меня возникла проблема: сначала...

Искажение кириллицы при отправке (клиент-сервер)
Здравствуйте. Когда-то давно написал клиент-серверное приложение, суть которого состоит в передаче сообщений клиентам через сервер (чат)....

Qt (Клиент - сервер), потоки
Здравствуйте, ниже приведен код сервера, не ругайтесь сильно за его кривость, пытаюсь переделать мой старый проект, в общем проблема...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2012, 15:37
Помогаю со студенческими работами здесь

Сервер-клиент на сокетах: при отправке второго сообщения, программа падает
Сервер: uses Sockets, CRT; var Fromname: array of char; Buffer,oldbuff,buff,UN: string; S:Longint; Sin,Sout:text; ...

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

Клиент-сервер, прием сообщений
Доброго времени суток. Писал в &quot;С++ для начинающих&quot;, но там никто мне не ответил... Есть программа-сервер с компонентом TServerSocket и...

Клиент-сервер и структура Point: как правильно её сериализировать и десереализировать при отправке
Приложение клиент-сервер, требуется отправить координаты, для этого идеально подходит структура Point. Не понять как правильно её...

Клиент-сервер, прием сообщений и форма
Доброго времени суток. Есть программа-сервер с компонентом TServerSocket и клиент - TClientSocket. С сервера отправляю 5 строк: ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru