задание сокета классом

Модератор: Модераторы разделов

inlines
Сообщения: 10
ОС: kubuntu 7.10

задание сокета классом

Сообщение inlines »

решил для удобства сделать сокет классом для упрощения програмы в с++

вот что написал:

Код: Выделить всё

#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

class s{

    protected:
    struct sockaddr_in sckddr;
    struct sockaddr_in pddr;
    int sd,sd1,pddrlen;
    int bresult,lresoult,selresoult;
    fd_set fds;
    public:
    s(int port){
        sckddr.sin_family=AF_INET;
        sckddr.sin_port=htons(port);
        sckddr.sin_addr.s_addr=INADDR_ANY;

        }

    int Socket(){
        if(this->sd=socket(PF_INET,SOCK_STREAM,0)<0){
        perror("socket");
        exit(1);
        }
        }
    int Bind(){
        if((this->bresult=bind(this->sd,(struct sockaddr*)&this->sckddr, sizeof(this->sckddr)))<0){
        perror("bind");
        exit(1);
        }
        }
    int Listen(){
        if(this->lresoult=listen(this->sd,5)<0){
        perror("listen");
        exit(1);
        }
        }

    int Select(){
        if(this->selresoult=select(FD_SETSIZE,&fds,NULL,NULL,NULL)<=0){
        perror("select");
        exit(1);
        }
        }
    };

int main(int argc, char** argv){
    if(argc!=2){
        printf("wrong parameters!\nexiting\n");
        exit(1);
        }
    if((atoi(argv[1])<2000)&&(atoi(argv[1])!=0)){
        printf("use port more than 2000\nexiting\n");
        }
    s a(atoi(argv[1]));
    a.Socket();
    a.Bind();
    a.Listen();
    a.Select();
    return 0;}


учу с++ 2 недели так что не судите строго))
проблема в том что при запуске програмы она сыплется на bind:
bind: Socket operation on non-socket
так же происходит и с любой другой функцией для этого класса

в чем может быть проблемма?
Спасибо сказали:
dronord
Сообщения: 40
ОС: slackware

Re: задание сокета классом

Сообщение dronord »

Ты сокету sd присваиваешь результат сравнения socket() < 0. Скорее всего он равен 0.
Т.е. правильно будет

Код: Выделить всё

if((sd=socket(PF_INET,SOCK_STREAM,0)) < 0)


P.S. Название класса, интерфейс, начинка - все не то. Пример интерфейса посмотри в MSDN или ACE. Убери exit() из методов.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: задание сокета классом

Сообщение Zeus »

А чему равен дескриптор сокета (sd) перед вызовом bind'а?

Я не помню приоритет многих операций, поэтому обычно явно указываю его (приоритет) явно - скобками.
И подозревал бы вот этот фрагмент:

Код: Выделить всё

if(this->sd=socket(PF_INET,SOCK_STREAM,0)<0)


Может sd присваивается не значение возвращённое функцией socket, а результат операции "<"?

P.S. Пока писал - уже ответили :)
Спасибо сказали:
inlines
Сообщения: 10
ОС: kubuntu 7.10

Re: задание сокета классом

Сообщение inlines »

dronord писал(а):
21.02.2008 09:37
Ты сокету sd присваиваешь результат сравнения socket() < 0. Скорее всего он равен 0.
Т.е. правильно будет

Код: Выделить всё

if((sd=socket(PF_INET,SOCK_STREAM,0)) < 0)


P.S. Название класса, интерфейс, начинка - все не то. Пример интерфейса посмотри в MSDN или ACE. Убери exit() из методов.



спасибо, поправил, а так как попытался сделать я впринципе делать нельзя или это просто коряво??
и если не сложно можно ссылочку на пример интерфейса MSDN или ACE плз
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: задание сокета классом

Сообщение drBatty »

inlines писал(а):
21.02.2008 20:24
спасибо, поправил, а так как попытался сделать я впринципе делать нельзя или это просто коряво??


Я думаю можно, просто скобки надо поставить. У "равно" вообще низкий приоритет, сделано это для того, что бы что-то вроде c = a + b; читалось по человечески, а не как сумма a и b, с одновременным присваиванием переменной с старого значения а ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
inlines
Сообщения: 10
ОС: kubuntu 7.10

Re: задание сокета классом

Сообщение inlines »

drBatty писал(а):
21.02.2008 20:40
inlines писал(а):
21.02.2008 20:24
спасибо, поправил, а так как попытался сделать я впринципе делать нельзя или это просто коряво??


Я думаю можно, просто скобки надо поставить. У "равно" вообще низкий приоритет, сделано это для того, что бы что-то вроде c = a + b; читалось по человечески, а не как сумма a и b, с одновременным присваиванием переменной с старого значения а ;)


спасибо,обнадежил))) то есть я имел ввиду, вообще можно так сокет классом задавать, как я сделал, а не нащет ляпа со скобками???
Спасибо сказали:
dronord
Сообщения: 40
ОС: slackware

Re: задание сокета классом

Сообщение dronord »

http://msdn2.microsoft.com/en-us/library/09353w3t.aspx
Но у МС как всегда, что-то начато, в корне неверное, сделано пару шагов вперед и завалилось набок. Потому что ну невозможно это дальше развивать, нужны гигантские усилия. Сейчас говорю о MFC. Кажется, тоже самое ожидает и .NET. Лан, к черту МС.

Вот здесь UDP сокет. http://www.dre.vanderbilt.edu/Doxygen/5.6....ace/a00510.html
Все остальное можно найти в окрестностях этой страницы.
Но для тебя будет сложно, потому смотри лучше на МС.

Но я бы посоветовал http://www.boost.org/libs/iostreams/doc/guide/concepts.html
Сам ешё не полностью разобрался, но по-моему, тебе нужно в пределах этой библиотеки разработать твой сокет.
Спасибо сказали:
Аватара пользователя
RVladimir
Сообщения: 8
ОС: WinXP/FreeBSD6.3/MDV2007.1PP

Re: задание сокета классом

Сообщение RVladimir »

inlines писал(а):
21.02.2008 08:59
решил для удобства сделать сокет классом для упрощения програмы в с++

Настоятельно рекомендую не изобретать велосипеды :)
Я сам, например, использую ASIO Library: http://asio.sourceforge.net
А вообще, чтобы хорошо разобраться как работать с сокетами, надобно вдумчиво почитать хелп и параллельно покопаться в уже работающих готовых библиотеках.
JID: rhub@jabber.ru
Спасибо сказали:
dronord
Сообщения: 40
ОС: slackware

Re: задание сокета классом

Сообщение dronord »

RVladimir, очень хорошо. Вписать бы это в концепцию Boost.Iostreams. Или так и есть? Я не понял.
Спасибо сказали: