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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2010, 16:52   #1
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию Winsock проблема

Товарищи программисты. Столкнулся с проблемой. Connect между сервером и клиентом происходит, а вот передача сообщения не происходит. Вызов функции recv(на сервере) не тормозит программу в ожидании сообщения, а происходит дальнейшее выполнение кода. Подскажите в чем мой ляпсус. Заранее спасибо.

Клиент:
Код:
int main()
{
WSADATA wData;
	struct sockaddr_in addr;
	SOCKET sock;
	if(WSAStartup(MAKEWORD(1,1),&wData)!=0)
	{
		return 0;

	}
		sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock==-1)
	{
		return 0;
	}

	addr.sin_family=AF_INET;
	addr.sin_port=htons(7500);
	addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	if (connect(sock,(struct sockaddr *)&addr,sizeof(addr))) {
	   cout<<"\nError connect...";
	   return 0;
	}
	char mes[10];
	cin>>mes;
	send(sock,(char*)&mes,sizeof(mes),0);
	cout<<"Message send.Please press key..";
	getch();
	shutdown(sock,2);
	closesocket(sock);
	WSACleanup();
	return 0;

}
Сервер:
Код:
WSADATA wData;
	struct sockaddr_in addr,serv_addr;
	SOCKET sock;
	if(WSAStartup(MAKEWORD(1,1),&wData)!=0)
	{
		ListBox1->Items->Add("Error WSAStartup!");
	}
		sock=socket(AF_INET,SOCK_STREAM,0);
	if(sock==-1)
	{
	 ListBox1->Items->Add("Error socket!");
	}
	addr.sin_family=AF_INET;
	addr.sin_port=htons(7500);
	addr.sin_addr.s_addr=INADDR_ANY;
	if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))){
	 ListBox1->Items->Add("Error socket bind!");
	}
	listen(sock,5);
	char buff[50];
	ListBox1->Items->Add(buff);
	ListBox1->Items->Add("Socket listen.");
		if (accept(sock,NULL,NULL)){
		ListBox1->Items->Add("Accept connect.");
		}
recv(sock,(char*)&buff,sizeof(buff),0);
		shutdown(sock,2);
	closesocket(sock);
	WSACleanup();
Armatus вне форума Ответить с цитированием
Старый 03.12.2010, 16:37   #2
AndrewGrodno
 
Регистрация: 03.12.2010
Сообщений: 3
По умолчанию

Ну не знаю как насчет "торможения", у меня твой код работает, но частично - сообщение не принимается, у тебя ошибка:

Код:
if (accept(sock,NULL,NULL)){
  ListBox1->Items->Add("Accept connect.");
ты упустил важный момент (или не понял)

Функция accept возвращает дескриптор типа SOCKET. То есть сервер создает новый сокет для работы с каждым соединением. И этот дескриптор ты должен передать в функцию recv:

Код:
SOCKET sock2;
//...
sock2=accept(sock,NULL,NULL);
recv(sock2,(char*)&buff,sizeof(buff),0);
AndrewGrodno вне форума Ответить с цитированием
Старый 03.12.2010, 21:33   #3
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Спасибо =) Это действительно я упустил.
Armatus вне форума Ответить с цитированием
Старый 08.12.2010, 10:34   #4
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Кто может подсказать как корректно пересылать функцией send значения типа int. Не могу корректно перевести char в int. В окне cout'ом выводит корректное значение 3(значение j),на сервер же приходит и выводится в листбокс символ Р(код 80). Подскажите в чем может быть проблема. Буду признателен.

Клиент:
Цитата:
if(WSAStartup(MAKEWORD(1,1),&wData) !=0)
{
return 0;

}
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==-1)
{
return 0;
}

addr.sin_family=AF_INET;
addr.sin_port=htons(7500);
addr.sin_addr.s_addr=inet_addr("127 .0.0.1");
if (connect(sock,(struct sockaddr *)&addr,sizeof(addr))) {
cout<<"\nError connect...";
return 0;
}

char b;
sprintf(&b,"%d",j);
cout<<b;;
send(sock,(char*)&b,sizeof(b),0);
shutdown(sock,2);
closesocket(sock);
WSACleanup();
}
Сервер:
Цитата:
WSADATA wData;

if(WSAStartup(MAKEWORD(1,1),&wData) !=0)
{
ListBox1->Items->Add("Error WSAStartup!");
}
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==-1)
{
ListBox1->Items->Add("Error socket!");
}
addr.sin_family=AF_INET;
addr.sin_port=htons(7500);
addr.sin_addr.s_addr=INADDR_ANY;
if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))){
ListBox1->Items->Add("Error socket bind!");
}
listen(sock,5);

ListBox1->Items->Add("Socket listen.");
sock=accept(sock,NULL,NULL);
char buff;
int i=recv(sock,(char*)&buff,sizeof(buf f),0);
ListBox1->Items->Add(buff);
shutdown(sock,2);
closesocket(sock);
WSACleanup();

Последний раз редактировалось Armatus; 08.12.2010 в 11:26.
Armatus вне форума Ответить с цитированием
Старый 08.12.2010, 14:02   #5
AndrewGrodno
 
Регистрация: 03.12.2010
Сообщений: 3
По умолчанию

В твоём случае ты можешь передать число от -127 до 127 (signed char). А не получается у тебя из-за sprintf. Я не пользовался ни разу этой функцией, потому не знаю почему так происходит. Почему ты не хочешь сразу присвоить нужное значение b?
Сделай так:

Клиент:
Код:
char b=j;
cout<<(int)b;//если хочешь вывести число а не символ
send(sock,&b,sizeof(b),0);
И приняв число, тоже приводи к int:

Сервер:
Код:
int i=recv(sock,&buff,sizeof(buff),0);
ListBox1->Items->Add((int)buff);
У меня работает.
AndrewGrodno вне форума Ответить с цитированием
Старый 10.12.2010, 08:52   #6
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Спасибо,AndrewGrodno!) Решил проблему.
Armatus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinSock Onekey Обсуждение статей 0 20.08.2010 12:04
Winsock n3sh C/C++ Сетевое программирование 2 25.07.2010 17:55
WinSock проблема с потерей данных Nicker Работа с сетью в Delphi 4 18.04.2010 03:08
проблема с WinSock i-cpp C/C++ Сетевое программирование 3 12.02.2010 23:28
WinSock Killbrum Win Api 1 18.10.2009 15:15