Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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


Ответ
 
Опции темы
Старый 11.03.2020, 23:20   #1
Duder
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию Слушать порт постоянно

Создал сервер, но после инициализации переменных проверяя их значения пишет ошибка в каждой- значение меньше 0 или равны 0
Как можно и где лучше зациклить код for(; чтобы сервер постоянно слушал соединение?
Код:
#include <WinSock2.h>
#include <sys/types.h>
#include <stdio.h>
#include <iostream>
//int bind(SOCKET s, const struct sockaddr *name, int namelen);
//s - это дескриптор прослушивающего сокета
//int listen(SOCKET s,int backlog);
//пометить сокет как прослушивающий.
//int accept(SOCKET s, struct sockaddr *addr, int *addrlen);
//служит для приема соединения, ожидающего во входной очереди.
//После того как соединение принято, его можно использовать для передачи данных,
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main(void)
{
	try {
	struct sockaddr_in local;
	int s;
	int s1;
	int rc;
	char buf[1];
	local.sin_family = AF_INET;
	local.sin_port = htonl(7500);
	local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	s = socket(AF_INET,SOCK_STREAM,0);
	if (s<0)
	{
		perror("Call socket error");
		//exit(1);
	}
	rc = bind(s,(struct sockaddr *)&local,sizeof(local));
	if(rc<0)
	{
		perror("call bind error");
		//exit(1);
	}

	rc = listen(s,5);
	if(rc)
	{
		perror("call listen error");
		//exit(1);
	}
	s1 = accept(s,NULL,NULL);
	if(s1<0)
	{
		perror ( "call accept error" );
        //exit ( 1 ) ;
	}

	rc = recv(s1,buf,1,0);
	if (rc<=0)
	{
perror("error recv call");
 exit ( 1 ) ;
	}
	printf("*%c\n",buf[0]);
	rc = send(s1,"2",1,0);
	if(rc<=0)
		perror("call send error");
	}
	catch(const std::exception& e)
	{
		printf("*%c\n",e);
	}
	//exit(0);
}
Duder вне форума Ответить с цитированием
Старый 12.03.2020, 00:20   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,677
По умолчанию

Цитата:
Сообщение от Duder Посмотреть сообщение
пишет ошибка
WinSock2 надо инициализировать перед использованием
Код:
    WSADATA wsaData;
    int err;

    err = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (err != 0) {
        printf("WSAStartup failed with error: %d\n", err);
        return 1;
    }

Цитата:
Сообщение от Duder Посмотреть сообщение
Как можно и где лучше зациклить код for(; чтобы сервер постоянно слушал соединение?
А это зависит от того, что нужно слушать. Ждать нового соединения или слушать уже подключённое
Black Fregat вне форума Ответить с цитированием
Старый 15.03.2020, 15:23   #3
Duder
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию

Сервер работает, но в клиенте есть не большие проблемы: С функции rc = connect(s,(struct sockaddr *)&peer, sizeof(peer)); и до rc = recv(s,buf,1,0); - их значения меньше нуля..
Хотя при создании сокета socket(AF_INET, SOCK_STREAM,0); ошибок нет... В чем мб загвоздка? IP "127.0.0.1"?
Код:
#include <WinSock2.h>
#include <sys/types.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

   
//int connectz(SOCKET s, struct sockaddr *peer, int peer_len);
///////////// s дескриптор сокета, peer структура адреса удаленного хоста, peerlen размер структуры в байтах
//int recv(SOCKET s, void *buf, size_t len, int flags);
//int send(SOCKET s, const void *buf, size_t len, int flags);
/* MSG_OOB - следует послать или принять срочные данные;
MSG_PEEK - используется для просмотра поступивших данных без их 
удаления из приемного буфера. После возврата из системного вызова данные еще
могут быть получены при последующем вызове read или recv;
MSG_DONTROUTE - сообщает ядру, что не надо выполнять обычный алгоритм
маршрутизации. Как правило, используется программами маршрутизации
или для диагностических целей.
*/
// TCP
//int recvfrom( SOCKET s, void *buf, size_t len , int flags ,
//struct sockaddr *from, int *fromlen );
//int sendto( SOCKET s , const void *buf, size_t len , int flags ,const struct sockaddr *to, int tolen ) ;

int main()
{
	WSADATA wsaData;
    int err;

    err = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (err != 0) {
        printf("WSAStartup failed with error: %d\n", err);
        return 1;
    }

	struct sockaddr_in peer;
	int s;
	int rc;
	char buf[1];
	peer.sin_family = AF_INET;
	peer.sin_port = htonl(7500);
	peer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	s = socket(AF_INET, SOCK_STREAM,0);
	if (s<0)
	{
		perror("call socket error");
		//exit(1);
	}
	rc = connect(s,(struct sockaddr *)&peer, sizeof(peer));
	if(rc)
	{
		perror("Call method connect");
	//	exit(1);
	}
	rc = send(s,"1",1,0);
	if(rc<=0)
	{
		perror("call error send");
		//exit(1);
	}
	rc = recv(s,buf,1,0);
	if( rc<=0)
		perror("call recv err");
		else
 printf( "%c\n", buf[ 0 ] );
	//exit(1);
	
	return 0;
}
Duder вне форума Ответить с цитированием
Старый 15.03.2020, 19:54   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,094
По умолчанию

Цитата:
Сообщение от Duder Посмотреть сообщение
s = socket(AF_INET, SOCK_STREAM,0);
Нужно указать протокол, последний параметр.
waleri вне форума Ответить с цитированием
Старый 15.03.2020, 23:21   #5
Duder
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Нужно указать протокол, последний параметр.
Загвоздка была в
Код:
rc = bind(s,(struct sockaddr *)&local,sizeof(local));
Поменяв на
Код:
rc = bind(s,(LPSOCKADDR)&local,sizeof(local));
и в accept
Код:
s1 = accept(s,NULL,NULL);
были неверные аргументы- заменив на
Код:
SOCKADDR_IN from;
	int fromlen=sizeof(from);
	s1 = accept(s,(struct sockaddr*)&from, &fromlen);
вижу на сервере кто подключился.

Но метод send по прежнему не работает...
Код:
char str[64] = "Hello";
 
        int i = send(sServ,str,strlen(str),1);
Duder вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста, слушать сервер вторым потоком mamkaror Java Мобильная разработка (Android) 1 27.05.2017 14:51
Слушать udp порт Letnab Работа с сетью в Delphi 5 26.05.2012 12:21
Байден посоветовал Саакашвили слушать маму Mr.Qwerty Свободное общение 0 23.07.2009 23:21
что это за theplanet.com такой? Постоянно приходят пакеты 67.15.231.73 на порт 80 Chi Безопасность, Шифрование 4 02.02.2009 00:52


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS