• XSS.stack #1 – первый литературный журнал от юзеров форума

Помогите разобраться с синтаксисом сокетов

ERma

floppy-диск
Пользователь
Регистрация
28.07.2005
Сообщения
7
Реакции
0
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

#define PORT 80

struct sockaddr_in hrm;//??????????????????????

int conn(){
int s;
s = socket(AF_INET, SOCK_STREAM, 0);//Создание сокета по протоколу TCP
if((connect(s,(struct sockaddr*)&hrm/*???????????*/,sizeof(struct sockaddr)/*???????????*/))<0);

}


помогите!!!!!! объясните пожалуйста что значат выделенные функции
 
я в С не сильна но первое - не функция а объявление структуры, вернее переменной тип у которой структура ( так кажется)
(struct sockaddr*) приведение типов
sizeof -размер переменнной

хотя мои знания лишь поверхностные, так что ...
 
2 ERma: сорри но если ты не разбираешь в синтаксисе программы
не рановато ли работать с сокетами ?
 
Найди в include-дире файлы: netinet/in.h sys/socket.h соответственно. Когда заглянешь внутрь, все поймешь, там расписаны все поля структыры sockaddr_in. В свое время и я там рылся, дабы прояснить ситуацию;)) настоятельно советую:)))
 
Кароче, в проге реализована работа с сокетами. Для шибко умных поясняю:
1) создание клиентского сокета
Код:
int main()
{
  /* для винды - раскомментировать следующие строки:
  WSADATA wsadata;
  WSAStartup(0x202, wsadata);
  // и добавить либу ws2_32.lib
  */
  int fd;
  fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  struct sockaddr_in sa;
  sa.sin_family=AF_INET;
  sa.sin_adr=inet_addr("111.222.333.444");
  sa.sin_port=htons(31337);
  connect(fd, (struct sockaddr*)&sa, sizeof(sa));
  // все, коннект установлен - можем читать/писать в сокет функами recv/send
  close(fd); // в винде - closesocket(fd);
}
2) создание серверного сокета
Код:
int main()
{
  /* для винды - раскомментировать следующие строки:
  WSADATA wsadata;
  WSAStartup(0x202, wsadata);
  // и добавить либу ws2_32.lib
  */
  int serv, fd;
  serv=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  struct sockaddr_in serv_sa, sa;
  serv_sa.sin_family=AF_INET;
  serv_sa.sin_addr.s_addr=INADDR_ANY; // для приема коннектов к любому интерфейсу, или =inet_addr(АЙПИ_ИНТЕРФЕЙСА)
  serv_sa.sin_port=htons(31337);
  bind(serv_fd, (struct sockaddr*)&serv_sa, sizeof(serv_sa));
  listen(serv_fd, 0); // вместо 0 указать длину очереди
  int size=sizeof(sa);

  // принимаем соединение. тут прога останавливается и ждет клиента
  fd=accept(serv_fd, (struct sockaddr*)&sa, &size);
  // соединение с клиентом установлено, читаем/пишем в сокет fd (send/recv)
  close(fd); // для винды - closesocket

  // заканчиваем принимать соединения
  close(serv_fd); // для винды - closesocket
}

Имхо, все понятно и так. В первом пункте мы коннектимся к 111,222,333,444 к порту 31337.
Во втором - принимаем соединения на порту 31337.
Отдельно отделена часть, где обрабатывается новый клиент.
Я не рассматривал так называемых "сырых" (RAW) сокетов, это отдельная тема.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх