LINUX.ORG.RU

проблема при прослушевании порта в потоке.


0

0

Всем привет!

Вот собственно проблема - пытаюсь прослушеывать порт в потоке и не получается , может я что накодил не так , посмотрите пожалуйста код.

template <class T, void (T::*method)(void)> void *wrapper(void* pObj) { T *obj = static_cast<T *>(pObj); (obj->*method)(); }

class server { public:

void create();

void run();

};

void server::create() {

pthread_t thread1;

pthread_create( &thread1, NULL,wrap_func<server,&server::run>, this);

}

void server::run() { // вот здесь и пытаюсь сесть на прослушевания порта

// bind(),listen(),accept().

// если не в потоке то все работает нормально!

}



Последнее исправление: malik555 (всего исправлений: 1)

Поток - это thread? Что за ошибку возвращает твой код? И весь код в студию.

mv ★★★★★
()
Ответ на: комментарий от mv

thread - да поток!
Код нечего не возвращает - тупа нехочет прослушевать порт.

[code=c]
template <class T, void (T::*method)(void)>
void *wrapper(void* pObj)
{
T *obj = static_cast<T *>(pObj);
(obj->*method)();
}

class server {
public:
void create();
void run();
};

void server::create()
{
pthread_t thread1;
pthread_create( &thread1,
NULL,wrap_func<server,&server::run>, this);
}

void server::run()
{
// вот здесь и пытаюсь сесть на прослушевания порта
int sockfd,client;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
socklen_t size;
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));

addr.sin_family = AF_INET;
addr.sin_port = htons(5190);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(sockfd,(struct sockaddr *) &addr, sizeof(addr)) != 0){
printf(«error bind() !»);
return;
}
if(listen(sockfd, 5) != 0){
printf(«error listen()»);
return;
}
while(1) {

size = sizeof(addr);
client = accept(sockfd, (struct sockaddr *) &addr, &size);
printf(«new client\n»);
}

}
[/code]

malik555
() автор топика
Ответ на: комментарий от Deleted

смотрел , только не пойму почему в моем случае не работает !

malik555
() автор топика
Ответ на: комментарий от malik555

Вот это работает:

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

template <class T, void (T::*method)(void)>
void *wrapper(void* pObj)
{
	T *obj = static_cast<T *>(pObj);
	(obj->*method)();
}

class server {
public:
	void create();
	void run();
};

void server::create()
{
	pthread_t thread1;
	pthread_create( &thread1,
			NULL,wrapper<server,&server::run>, this);
}

void server::run()
{
// вот здесь и пытаюсь сесть на прослушевания порта
	int sockfd,client;
	sockfd = socket(PF_INET, SOCK_STREAM, 0);
	socklen_t size;
	struct sockaddr_in addr;
	bzero(&addr, sizeof(addr));

	addr.sin_family = AF_INET;
	addr.sin_port = htons(5190);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);

	if(bind(sockfd,(struct sockaddr *) &addr, sizeof(addr)) != 0){
		printf("error bind() !\n");
		return;
	}
	if(listen(sockfd, 5) != 0){
		printf("error listen()\n");
		return;
	}
	while(1) {

		size = sizeof(addr);
		client = accept(sockfd, (struct sockaddr *) &addr, &size);
		printf("new client\n");
	}

}

int main()
{
	server s;
	s.create();
	sleep(600);
}

mv ★★★★★
()
Ответ на: комментарий от malik555

а когда sleep(600); заканчивается и прослушевание порта заканчивается , а почему так ? что нельзя что-б один поток слушал порт а гравный дальше работал ?

malik555
() автор топика
Ответ на: комментарий от malik555

Если ты хочешь, чтобы твоя программа запускалась и оставалась работать на фоне, то man 3 daemon

mv ★★★★★
()
Ответ на: комментарий от malik555

> получается нужен sleep(600); а без него не работает

Работает, но не долго )

Alesh
()
Ответ на: комментарий от malik555

а что так не правельно ? они не должны встречаться ?

Это называется overkill. Ты в своём коде не используешь возможности C++, поэтому он выглядит нелепо. Собственно говоря, class'ом ты себе создаёшь проблему, которую template'ом решаешь. Зачем? Или на C++ всё пиши (boost::asio в руки), или на чистом C.

mv ★★★★★
()
Ответ на: комментарий от mv

Ну просто в моей программе много классов - на форум я выложил один в котором и была проблема

malik555
() автор топика

Grammar Nazi не одобряет этот топик.

runtime ★★★★
()
Ответ на: комментарий от frey

>>прослушевание

мля, жи/ши пиши с буквы И.

ну или на худой конец через Ы, ну никак уж не через Е

Deleted
()
Ответ на: комментарий от LamerOk

> В школу.

За что ты так ненавидишь школу? TC - только в биореактор - срочно и без вариантов

Led ★★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.