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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2020, 22:20   #1
Duder
Пользователь
 
Регистрация: 03.03.2020
Сообщений: 10
По умолчанию Слушать порт постоянно

Создал сервер, но после инициализации переменных проверяя их значения пишет ошибка в каждой- значение меньше 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 вне форума Ответить с цитированием
Старый 11.03.2020, 23:20   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от 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, 14:23   #3
Duder
Пользователь
 
Регистрация: 03.03.2020
Сообщений: 10
По умолчанию

Сервер работает, но в клиенте есть не большие проблемы: С функции 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, 18:54   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

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

Цитата:
Сообщение от 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 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста, слушать сервер вторым потоком mamkaror Java Мобильная разработка (Android) 1 27.05.2017 13: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 01.02.2009 23:52