![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#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. |
![]() |
![]() |
![]() |
#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; } |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как отправить видео захват(с веб-Кам.) Клиент->Сервер->Клиент | 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 |