На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Установка библиотек unistd.h sys/socket.h netinet/in.h , где взять?
    При попытке компиляции Borland ругается на
    #include <unistd.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    и соответственно на функции socket(AF_INET, SOCK_STREAM, 0) и т.д.

    Вопрос, где можно взять эти библиотеки и как их подключить.

    (Если нужно для этого инсталлировать компонент, то какой?)

    Возможно такой вопрос уже поднимался, но ответ найти не удалось.
    Сообщение отредактировано: Fluffy Pearl -
      Портировать никсовые исходники в виндовс уметь надо.
      include'ы удалить и добавить #include <winsock2.h>. Правда не факт, что не возникнет еще тучи ошибок... :)
        Теперь ругается на строку

        ExpandedWrap disabled
          setsockopt(s0, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));



        [C++ Error] server.cpp(50): E2034 Cannot convert 'linger *' to 'const char *'
        [C++ Error] server.cpp(50): E2342 Type mismatch in parameter 'optval' (wanted 'const char *', got 'linger *')
        [C++ Error] server.cpp(61): E2451 Undefined symbol 'socklen_t'
        [C++ Error] server.cpp(61): E2379 Statement missing ;
        [C++ Error] server.cpp(62): E2451 Undefined symbol 'peeraddr_len'
        [C++ Warning] server.cpp(93): W8004 'linger_opt' is assigned a value that is never used

        Подскажите, как исправить?

        Код всей программы (в инете нашла)

        ExpandedWrap disabled
          //
          // A simple Internet server application.
          // It listens to the port written in command line (default 1234),
          // accepts a connection, and sends the "Hello!\r\n" message
          // to a client. Then it receives the answer from a client and terminates.
          //
          // Usage:
          //      server [port_to_listen]
          // Default is the port 1234.
          //
          #include <stdio.h>
          #include <string.h>
          #include <stdlib.h>
          #include <io.h>
          #include <winsock2.h>
           
          static void usage();
           
          int main(int argc, char *argv[]) {
              if (argc > 1 && *(argv[1]) == '-') {
                  usage(); exit(1);
              }
           
              int listenPort = 1234;
              if (argc > 1)
                  listenPort = atoi(argv[1]);
           
              // Create a socket
              int s0 = socket(AF_INET, SOCK_STREAM, 0);
              if (s0 < 0) {
                  perror("Cannot create a socket"); exit(1);
              }
           
              // Fill in the address structure containing self address
              struct sockaddr_in myaddr;
              memset(&myaddr, 0, sizeof(struct sockaddr_in));
              myaddr.sin_family = AF_INET;
              myaddr.sin_port = htons(listenPort);        // Port to listen
              myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
           
              // Bind a socket to the address
              int res = bind(s0, (struct sockaddr*) &myaddr, sizeof(myaddr));
              if (res < 0) {
                  perror("Cannot bind a socket"); exit(1);
              }
           
              // Set the "LINGER" timeout to zero, to close the listen socket
              // immediately at program termination.
              struct linger linger_opt = { 1, 0 }; // Linger active, timeout 0
              setsockopt(s0, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));
           
              // Now, listen for a connection
              res = listen(s0, 1);    // "1" is the maximal length of the queue
              if (res < 0) {
                  perror("Cannot listen"); exit(1);
              }
           
              // Accept a connection (the "accept" command waits for a connection with
              // no timeout limit...)
              struct sockaddr_in peeraddr;
              socklen_t peeraddr_len;
              int s1 = accept(s0, (struct sockaddr*) &peeraddr, &peeraddr_len);
              if (s1 < 0) {
                  perror("Cannot accept"); exit(1);
              }
           
              // A connection is accepted. The new socket "s1" is created
              // for data input/output. The peeraddr structure is filled in with
              // the address of connected entity, print it.
              printf(
                  "Connection from IP %d.%d.%d.%d, port %d\n",
                  (ntohl(peeraddr.sin_addr.s_addr) >> 24) & 0xff, // High byte of address
                  (ntohl(peeraddr.sin_addr.s_addr) >> 16) & 0xff, // . . .
                  (ntohl(peeraddr.sin_addr.s_addr) >> 8) & 0xff,  // . . .
                  ntohl(peeraddr.sin_addr.s_addr) & 0xff,         // Low byte of addr
                  ntohs(peeraddr.sin_port)
              );
           
              res = close(s0);    // Close the listen socket
           
              write(s1, "Hello!\r\n", 8);
           
              char buffer[1024];
              res = read(s1, buffer, 1023);
              if (res < 0) {
                  perror("Read error"); exit(1);
              }
              buffer[res] = 0;
              printf("Received %d bytes:\n%s", res, buffer);
           
              close(s1);          // Close the data socket
              return 0;
          }
           
          static void usage() {
              printf(
                  "A simple Internet server application.\n"
                  "It listens to the port written in command line (default 1234),\n"
                  "accepts a connection, and sends the \"Hello!\" message to a client.\n"
                  "Then it receives the answer from a client and terminates.\n\n"
                  "Usage:\n"
                  "     server [port_to_listen]\n"
                  "Default is the port 1234.\n"
              );
          }


        Добавлено
        Если заменить socklen_t на int (как я поняла они должны быть равны),
        то отсаются только ошибки:

        [C++ Error] server.cpp(50): E2034 Cannot convert 'linger *' to 'const char *'
        [C++ Error] server.cpp(50): E2342 Type mismatch in parameter 'optval' (wanted 'const char *', got 'linger *')

        к строке
        ExpandedWrap disabled
          setsockopt(s0, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));


        Что с этим можно сделать?

        Добавлено
        Заработало! Вот как далжно это выглядить.

        setsockopt(s0, SOL_SOCKET, SO_LINGER, (char *) &linger_opt, sizeof(linger_opt));
          Во первых по большому счету для простой программы сервера лингер не нужен - так что просто закомментируйте эти строки
          Во вторых, поставьте здесь
          res = listen(s0, 1)
          бэклог 5:
          res = listen(s0, 5)
          Ну и прототип для Виндовс такой:
          int setsockopt(
          SOCKET s,
          int level,
          int optname,
          const char FAR* optval,
          int optlen);
          Попробуйте так:
          Err = setsockopt(s0, SOL_SOCKET, SO_LINGER, (char *)&OptVal, sizeof(OptVal));
            Но Выдает ошибку Cannot create a socket: 0


            ExpandedWrap disabled
              // Create a socket
                  int s0 = socket(AF_INET, SOCK_STREAM, 0);
                  if (s0 < 0) {
                      perror("Cannot create a socket"); getchar(); exit(1);
                  }


            Добавлено
            С чем это может быть связанно?
            Идей нет совсем... :no-sad:
              Сокет в виндах не int - a SOCKET s

              Добавлено
              Цитата Fluffy Pearl @
              Но Выдает ошибку Cannot create a socket: 0

              Cтранно - вы ведь только что написали, что заработало? :wacko:
                Воспользовалась таким советом и заработало:

                Цитата
                Прежде чем воспользоваться функцией socket необходимо проинициализировать процесс библиотеки wsock32.dll вызвав функцию WSAStartup например:


                WSADATA WsaData;
                int err = WSAStartup (0x0101, &WsaData);
                if (err == SOCKET_ERROR)
                {
                printf ("WSAStartup() failed: %ld\n", GetLastError ());
                return 1;
                }

                Здесь 0х0101 версия библиотеки которую следует использовать.

                :whistle:

                Oleg2004
                Заработало - в смысле перестало выдавать ошибки на этапе коипиляции.
                  Цитата Fluffy Pearl @
                  Прежде чем воспользоваться функцией socket необходимо проинициализировать процесс библиотеки wsock32.dll вызвав функцию WSAStartup например:

                  А вы это не сделали??????
                  Ну что ж, теперь будете знать :yes:
                  Еще в конце при выходе надо сделать WSACleanup() :yes:
                    Спасибо ;)
                    До этого я видимо не дошла. :rolleyes:
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0671 ]   [ 16 queries used ]   [ Generated: 26.06.25, 05:47 GMT ]