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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2008, 23:23   #1
Han_Nik
 
Регистрация: 09.06.2008
Сообщений: 7
По умолчанию Помогите пожалуйста

Есть программа echo сервер при отправке сообщения если оно более 64 символов то сервер получает сообщение из 64 символов, но больше отправит сообщение нельзя, как исправить, помогите пожалуйста

Код:
#pragma hdrstop

#include <stdio.h>
#include <iostream>
#include <winsock2.h>
using namespace std;

int main()
{
     //подключаем библиотеку winsock.dll
     WSADATA wsaData; 
     if (WSAStartup(0x0202,&wsaData))
     {
          cout << "error using winSock.dll" << endl;
          cin.get();
          WSACleanup();
     }
     //создаем сокет
     SOCKET s = socket(AF_INET,SOCK_STREAM,0);
     if (s == INVALID_SOCKET)
     {
          cout << "error using ""socket"" function" << endl;
          cin.get();
          WSACleanup();
     }     
     //создаем структуру со своствами сокета
     SOCKADDR_IN sa;
     sa.sin_family = AF_INET;
     sa.sin_port = htons(27015);
     sa.sin_addr.s_addr = inet_addr("127.0.0.1");
     // устанавливаем соединение
     if (SOCKET_ERROR == (connect (s, (SOCKADDR *) &sa, sizeof (sa)))) 
     { 
          printf("Error in connect(...)\n");
          cin.get();
          WSACleanup();
     }
     // передача данных
     int bytesRecv = SOCKET_ERROR;    
     char sendbuf[64];
     char recvbuf[64];
     
     while (sendbuf[0] != 'q')
     {
          strcpy(sendbuf,"");
          strcpy(recvbuf,"");
          bytesRecv = SOCKET_ERROR;

          cout << "Enter the message: ";
          cin >> sendbuf;

          if (send(s,sendbuf, 64, 0) > 0)
          {
            cout << "Message Sent: " << sendbuf << endl;
          }
          while( bytesRecv == SOCKET_ERROR ) 
          {
               bytesRecv = recv(s,recvbuf,64,0);
               if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) 
               {
                    printf( "Connection Closed.\n");
                    break;
               }
               if (bytesRecv < 0)
                    break;
               cout << "Message Recv: " << recvbuf << endl;
          }
     }
     cin.get();
     WSACleanup();
    return 0;
}
Используйте тег <CODE>

Последний раз редактировалось merax; 09.06.2008 в 23:26.
Han_Nik вне форума Ответить с цитированием
Старый 09.06.2008, 23:27   #2
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Ппц... Посмотри внимательно на определение буферов... Что ты там видишь?
merax вне форума Ответить с цитированием
Старый 09.06.2008, 23:36   #3
Han_Nik
 
Регистрация: 09.06.2008
Сообщений: 7
По умолчанию

Напиши пожалуйста конкретно что надо исправить...
Han_Nik вне форума Ответить с цитированием
Старый 09.06.2008, 23:45   #4
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Вот буфера сообщений, так?

Код:
char sendbuf[64];   
char recvbuf[64];
А потом еще функции реализации отправки... Что видишь?
merax вне форума Ответить с цитированием
Старый 09.06.2008, 23:49   #5
Han_Nik
 
Регистрация: 09.06.2008
Сообщений: 7
По умолчанию

я понимаю, как мне исправит так что бы он обрубал если больше 64 и продолжал работать, или как исправить что бы кол-во символов было не ограничено
Han_Nik вне форума Ответить с цитированием
Старый 10.06.2008, 00:13   #6
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Вариант 1) Проверяем вводимую строку на колличество символов,

Код:
 char *ch;

           ch = new char[64];

	cout << "Введите строку " << endl;
	cin >> ch;

	if(strlen(ch) > 64)
	{
		cout << "Строка длиннее 64 символов";
	}
Вариант 2:

Код:
 char sendbuf[10000];
           char recvbuf[10000];
Код:
  if (send(s,sendbuf, 10000, 0) > 0)

          bytesRecv = recv(s,recvbuf,10000,0);
Проверить не могу... на Висте что то не подключает винсок
merax вне форума Ответить с цитированием
Старый 10.06.2008, 00:41   #7
Han_Nik
 
Регистрация: 09.06.2008
Сообщений: 7
По умолчанию

Спасибо, но такие варианты у меня уже были
Han_Nik вне форума Ответить с цитированием
Старый 10.06.2008, 06:33   #8
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Тогда стучи в асю за 10$ допишу модуль который будет разбивать строку и отправлять по частям.
merax вне форума Ответить с цитированием
Старый 10.06.2008, 12:31   #9
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

Цитата:
int SendTo(SOCKET sock, char* buffer, int length)
{
int ret;
int nSendSize = length;
int iCurrPos = 0;

while(nSendSize >0)
{
ret = send(sock, &buffer[iCurrPos], nSendSize, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
// MessageBox(0, "Send failed", "Error", 0);
break;
}
nSendSize -= ret;
iCurrPos += ret;
}
return ret;
}



int ReceiveFrom(SOCKET sock, char* buffer, int length)
{
int nSendSize = length;
int iCurrPos = 0;
int ret;

while(nSendSize >0)
{
ret = recv(sock, &buffer[iCurrPos], nSendSize, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
// MessageBox(0, "Receive failed", "Error", 0);
break;
}
nSendSize -= ret;
iCurrPos += ret;
}

return ret;
}
принятие и отправка строки байт неограниченной длины
vvviperrr вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста!!! Esenin Помощь студентам 1 21.06.2008 01:45
Помогите пожалуйста Niki Помощь студентам 4 07.06.2008 08:30
помогите пожалуйста pelsh Помощь студентам 2 21.12.2007 00:26