Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > SOCKET


Автор: chaos 3.11.2004, 13:50
Подскажите как получить дескриптор сокета и пребить его

Автор: dargaard 4.11.2004, 21:30
Что значит пребить?

Исползуи "socket( ...)" вызов.

socket ( AF_INET, тип сокета, протокол)

например:

#include <sys/socket.h>
#include <sys/types.h>

int sock;
sock = socket(AF_INET, SOCK_DGRAM,0); (датаграмы - для udp например)

sock = socket (AF_INET, SOCK_STREAM,0); (для tcp/ip)


далее для udp используешь bind на сервере:
Код

struct sockaddr_in serv;
int portno;
   portno = 5555;
   serv.sin_family = AF_INET;
   serv.sin_addr.s_addr = INADDR_ANY;
   serv.sin_port = htons(portno);

   ret = bind (sock,(struct sockaddr*) &serv, sizeof(serv));


и для чтения/записи - sendto (...) recvfrom ( ... )

Для tcpip:
используешь bind+listen+accept
Код

struct sockaddr_in serv_addr;
   bzero(&serv_addr,sizeof(serv_addr));

   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
   serv_addr.sin_port = htons (port);

   if (bind(fd, (struct sockaddr*)&serv_addr,sizeof(serv_addr)) <0 ) {
       printf("Bind error\n");
       return -1;
   }
                                                                               
   if (listen(fd,10)<0) {
       printf("listen error\n");
       return -1;
   }

   int connectfd;
   struct sockaddr_in client;
   int cllen = sizeof (client);
   connectfd = accept(fd,(struct sockaddr*)&client, &cllen);

   if (connectfd<0) {
       printf("Connection error\n");
       return -1;
   }
                                                             
// Соединились уже:)

для клиента используешь connect(...)
Код


char *ip = ...

   struct sockaddr_in con_addr;
   con_addr.sin_family = AF_INET;
   con_addr.sin_port = htons(port);
   inet_pton(AF_INET,ip,&con_addr.sin_addr.s_addr);

 int fd = socket(AF_INET,SOCK_STREAM,0);

if (connect(fd,(struct sockaddr*) &con_addr,sizeof(con_addr)) <0) {
//error
   }



для чтения/записи - read ( ... ) / write ( ... )



Добавлено @ 21:34
В конце для закрытия - close (sock)

Автор: A... 4.11.2004, 21:51
А лутше сперва прочитать этот документ...

http://www.ecst.csuchico.edu/~beej/guide/net/bgnet_pdf.zip

Автор: Vaulter 10.11.2004, 12:59
набери man socket и будет щастье тебе, и откроются глаза твои и узреешь

Автор: Kenterell 8.12.2004, 16:49
Po4emu C ne ponimaet class sockaddr_in?
vklu4au nujnie biblioteki, a nifiga...

Автор: dargaard 8.12.2004, 17:06
Kenterell
Модератор: Пожалуйста, один топик - один вопрос.

#include <netdb.h>


Автор: Kenterell 8.12.2004, 17:25
Tam bil drugoy vopros, potom poyavilsya po hodu drugoy... Horosho...
I spasibo.

Автор: Гость_SuN 10.1.2005, 12:13
2Kenterell
sockaddr_in это не класс, это структура, С не понимает такого объявления:
sockaddr_in sock; // а вот С++ поймет, для С же нужно так:
struct sockaddr_in sock; как и было описано выше

Автор: Kenterell 12.1.2005, 13:49
A teper' eshe odin: kak poluchit' avtorizaciyu socket'a cherez proxy

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)