Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2012, 11:00   #1
Чиффа
Пользователь
 
Регистрация: 24.09.2012
Сообщений: 11
Печаль Клиент-сервер(непонятный вывод на экран)

Здравствуйте программисты, кто может подсказать в чем тут дело, никак не могу разобраться, на экран консоли сервера(да и клиента тоже) при первом подключении выводится вместо первого символа, введенного сообщения какая-то ерунда... далее приём сообщений идёт нормально.
Ошибка кроется где то в функции recv - именно в ней происходит замена первого символа... не понимаю почему.

Вот код сервера:

#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 <string.h>
#include <pthread.h>
#include <cstdlib>
using namespace std;

char Message1[300] = {"server"};
char Message2[300] = {"__sending.."};
int sock;
int Client;

void * wrt(void * arg);
void * rd(void * arg);
int exit_close();

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 = inet_addr("127.0.0.1");//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;
printf("Now u can exchange messages...\n");
//result = pthread_create(&thr1, NULL, wrt, &id1);
result = pthread_create(&thr2, NULL, rd, &id2);

while(true)
{}
return 0;
}

void * wrt(void * arg) // Функция отправки сообщений
{
while(true)
{
scanf("%299s",Message1);
int r_write = send(Client, Message1, sizeof(Message1), 0);
if (strcmp(Message1, "quit") == 0 )
{
exit_close();
exit(0);
}
if ( r_write <= 0 )
{
perror( "ошибка вызова send" );
exit_close();
exit( 1 );
}
}
}

void * rd(void * arg) // Функция приёма сообщений
{
while(true)
{
if (recv(Client, Message2, sizeof(Message2) , 0) > 0 )
printf("reading: %s\n", Message2);
else if (strcmp(Message2, "quit") == 0)
{
printf("Client out...\n");
exit_close();
exit( 0 );
}
else
{
printf("Error of reading!\n");
exit_close();
exit( 1 );
}
}
}

int exit_close()
{
shutdown(sock, 0);
close(sock);
close(Client);
return 0;
}

Последний раз редактировалось Чиффа; 01.10.2012 в 11:37.
Чиффа вне форума Ответить с цитированием
Старый 01.10.2012, 11:01   #2
Чиффа
Пользователь
 
Регистрация: 24.09.2012
Сообщений: 11
По умолчанию

Вот код клиента:

#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 <string.h>
#include <pthread.h>

using namespace std;

char Message1[300] = {"Client"};
char Message2[300] = {"_sending..."};
int sock;

void * wrt(void * arg);
void * rd(void * arg);
int exit_close();

int main( void )
{
char PCName[30], ServerName[30];
struct sockaddr_in clien;
gethostname(PCName, 30); // Получение имени текущего ПК

int r_read;
int r_write;
int r_connect;

clien.sin_family = AF_INET;
clien.sin_port = htons( 7500 );
clien.sin_addr.s_addr = inet_addr( "127.0.0.1" );

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;
printf("Now u can exchange messages...\n");
result = pthread_create(&thr1, NULL, wrt, &id1);
//result = pthread_create(&thr2, NULL, rd, &id2);

while(true)//бесконечный цикл
{}

return 0;
}

void * wrt(void * arg)
{
while(true)
{
scanf("%299s",Message1);
int r_write = send(sock, Message1, sizeof(Message1), 0);
if (strcmp(Message1, "quit") == 0 )
{
exit_close();
exit(0);
}
if ( r_write <= 0 )
{
perror( "ошибка вызова send" );
exit_close();
exit( 1 );
}
}
}

void * rd(void * arg)
{
while(true)
{
if ( recv(sock, Message2, sizeof(Message2), 0) > 0 )
printf("reading: %s\n", Message2);
else if (strcmp(Message2, "quit") == 0)
{
printf("Server out...\n");
exit_close();
exit( 0 );
}
else
{
printf("Error of reading!\n");
exit_close();
exit( 1 );
}
}
}

int exit_close()
{
shutdown(sock, 0);
close(sock);
return 0;
}
Чиффа вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отправить видео захват(с веб-Кам.) Клиент->Сервер->Клиент RODNOC Мультимедиа в Delphi 17 03.10.2010 22:31
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57