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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2014, 13:31   #1
xquant1x
Новичок
Джуниор
 
Регистрация: 14.09.2014
Сообщений: 1
Печаль tcp. клиент сервер. проблема с recv.

Всем привет! Столкнулся с проблемой зависания на recv. На сервер отправляется строка, там она разбивается на подстроки. Затем сервер отправляет данные обратно, клиент принимает вроде бы все, но при этом не продолжается работа дальше(по идее должен произойти запрос на ввод следующей строки), он просто подвисает, ждет. Хотелось бы узнать как с этой проблемой справится.
Понимаю что виснет на recv, пробовал с неблокирующим сокетом не помогло, может что еще есть.
Сервер:
Код:
#include "stdafx.h"

void receive_words(SOCKET, char*);

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA WsaData;
	int err = WSAStartup (0x0101, &WsaData);
	if (err == SOCKET_ERROR)
	{
           printf ("WSAStartup() failed: %ld\n", GetLastError ());
           return 1;
	}

	SOCKET server = socket(AF_INET,SOCK_STREAM,0);

	SOCKADDR_IN sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(5000);
	sin.sin_addr.s_addr = htonl(INADDR_ANY);

	printf("Server.\n");
	bind( server, (LPSOCKADDR)&sin, sizeof(sin) );
	printf("Waiting to connect...\n");
	if (listen( server, SOMAXCONN) == -1)
	{
		printf("Failed to listen");
		return -1;
	}

	SOCKADDR_IN from;
	int fromlen = sizeof(from);
	SOCKET sock = accept(server,(struct sockaddr*)&from, &fromlen);

	printf("Accepted connection from %s\n", inet_ntoa(from.sin_addr)) ;

	char buffer[1];
	int recvm = 0;

	while((recvm = recv(sock,buffer,sizeof(buffer),0)) > 0 && recvm != SOCKET_ERROR)
	{
		buffer[recvm] = 0;
		cout<<buffer;
		send(sock,buffer,sizeof(buffer),0);
		//receive_words(sock, buffer);
	}
	
	closesocket(server);
	system("pause");
	return 0;
}

void receive_words(SOCKET sock, char* buf)
{
	char *temp;
	
	temp = strtok(buf," ");
	while (temp != NULL)
	{
		send(sock,temp,sizeof(temp),0);
		temp = strtok(NULL," ");
	}	
}
Клиент:
Код:

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA WsaData;
	int err = WSAStartup (0x0101, &WsaData);
	if (err == SOCKET_ERROR)
	{
           printf ("WSAStartup() failed: %ld\n", GetLastError ());
           return 1;
	}

	SOCKET client = socket(AF_INET,SOCK_STREAM,0);

	SOCKADDR_IN sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(5000);
	sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	connect(client, (struct sockaddr *)&sin, sizeof(struct sockaddr));

#define SIZE 5

	string message,tag;
	char buffer[SIZE]; 
	int recvm;

    while (true)
    {
        cout << "string >>";
		getline(cin,message);
		if (message == "exit")
		{
			break;
		}
		send(client,message.c_str(),strlen(message.c_str())+1,0);
		while((recvm = recv(client,buffer,sizeof(buffer),0)) != 0 && recvm != SOCKET_ERROR)
		{
			buffer[recvm] = 0;
			for (int i = 0; i < strlen(buffer) ;i++)
			{
				if (buffer[i] == ' ')
					cout<<endl;
				else 
					cout<<buffer[i];
			}
		}
	}

	closesocket(client);
	WSACleanup();
	return 0;
}
recv который прнимает строку на сервере работает нормально, в клиенте что то не так...
xquant1x вне форума Ответить с цитированием
Старый 14.09.2014, 23:56   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

У вас в клиенте два вложенных while цикла.
Войдя во второй клиент продолжает читать из сокета не запрашивая ввод.
Измените второй while на if
waleri вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самописные Клиент-Сервер (TCP/IP) в LAN работают, в WAN нет. _drug_ C/C++ Сетевое программирование 2 15.12.2011 10:21
сервер-клиент, recv-send и проблема с передаваемыми символами. Ksardas13 Общие вопросы C/C++ 9 27.03.2011 20:49
TCP/IP клиент -сервер zhenya.ya C/C++ Сетевое программирование 10 05.03.2011 22:01
как создать TCP клиент, TCP сервер ? DreamMaster911 C/C++ Сетевое программирование 1 26.10.2010 15:05
простой сервер(клиент) TCP nntpaha Общие вопросы C/C++ 4 25.12.2007 19:02