Непонятки с sockaddr_in

Тема в разделе "LANGS.C", создана пользователем Bonez92, 28 фев 2010.

  1. Bonez92

    Bonez92 Евгений

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    16
    Адрес:
    Уфа
    Здравствуйте.
    Пользуюсь компилятором MinGW. Вот код:
    Код (Text):
    1. #include <winsock2.h>
    2. #include <stdio.h>
    3. #include <windows.h>
    4.  
    5. int main()
    6. {
    7.     char* header="GET / HTTP 1.1\nHost: localhost\nUser-Agent: MyBot\nAccept: */*\nPragma: no-cache\nCache-Control: no-cache\0";
    8.    
    9.     WORD wVersionRequested;
    10.     WSADATA wsaData;
    11.     SOCKET hSocket, client_socket;
    12.     sockaddr_in client_addr;
    13.        
    14.     char msg[25];
    15.     int msg_len, client_addr_len;
    16.  
    17.     wVersionRequested = 2;
    18.     WSAStartup(wVersionRequested, &wsaData);
    19.    
    20.     puts ("HTTP. GET.\n\n");
    21.    
    22.     puts (header);
    23.    
    24.    
    25.     return 0;
    26. }
    При попытке компиляции с помощью gcc (т.е. как программу на C) с параметром -lws2_32 вылезает ошибка "sockaddr_in undeclared (first use in this function)". А если компилирую с помощью g++ (т.е. как программу на C++) с таким-же параметром - то успешно компилируется.

    Мне хотелось бы, чтобы код компилировался под "C" компилятором.

    Скажите пожалуйста, в чем причина этого явления и как исправить.
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    попробуй
    struct sockaddr_in client_addr;
     
  3. Bonez92

    Bonez92 Евгений

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    16
    Адрес:
    Уфа
    Не получилось.
    Вот то что я нашел в winsock2.h
    Код (Text):
    1. struct sockaddr_in {
    2.     short   sin_family;
    3.     u_short sin_port;
    4.     struct  in_addr sin_addr;
    5.     char    sin_zero[8];
    6. };
    Все это правильно обьявлено?
     
  4. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    int main()
    это определение функции в старом стиле по стандарту надо писать
    int main(void) в определении и в прототипе вот что по этому поводу пишут Керниган и Ритчи книга K&R ANSI C

    Имеются два способа объявления функции. В новом способе типы параметров задаются явно и являются частью типа функции; такое объявление называется прототипом функции. При старом способе типы параметров не указываются. Способы объявления функций обсуждаются в A8.6.3 и A10.1.

    Если вызов находится в области видимости объявления, написанного по-старому, каждый его аргумент подвергается операции повышения типа: для целочисленных аргументов осуществляется целочисленное повышение (A6.1), а для аргументов типа float - преобразование в double. Если число аргументов не соответствует количеству параметров в определении функции или если типы аргументов после повышения не согласуются с типами соответствующих параметров, результат вызова не определен. Критерий согласованности типов зависит от способа определения функции (старого или нового). При старом способе сравниваются повышенный тип аргумента в вызове и повышенный тип соответствующего параметра; при новом способе повышенный тип аргумента и тип параметра (без его повышения) должны быть одинаковыми.

    Если вызов находится в области видимости объявления, написанного по-новому, аргументы преобразуются, как если бы они присваивались переменным, имеющим типы соответствующих параметров прототипа. Число аргументов должно совпадать с числом явно описанных параметров, если только список параметров не заканчивается многоточием (, ...). В противном случае число аргументов должно быть больше числа параметров или равно ему; "скрывающиеся" под многоточием аргументы подвергаются операции повышения типа (так, как это было описано в предыдущем абзаце). Если определение функции задано по-старому, то типы параметров в прототипе, которые неявно присутствуют в вызове, должны соответствовать типам параметров в определении функции после их повышения.

    Эти правила особенно усложнились из-за того, что они призваны обслуживать смешанный способ (старого с новым) задания функций. По возможности его следует избегать.
    Очередность вычисления аргументов не определяется, в разных компиляторах она различна. Однако гарантируется, что аргументы и именующее выражение функции вычисляются полностью (включая и побочные эффекты) до входа в нее. Любая функция допускает рекурсивное обращение.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    osox
    В определении функции по-барабану как писать, main() или main(void).
    Пишешь про определение, а приводишь цитату про объявление.
     
  6. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    бустер спи ))
     
  7. Bonez92

    Bonez92 Евгений

    Публикаций:
    0
    Регистрация:
    15 окт 2008
    Сообщения:
    16
    Адрес:
    Уфа
    Проблема решена.
    В нужно исправить обьявление структуры.
    Код (Text):
    1. typedef struct sockaddr_in {
    2.     short   sin_family;
    3.     u_short sin_port;
    4.     struct  in_addr sin_addr;
    5.     char    sin_zero[8];
    6. } sockaddr_in;
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Bonez92
    ЛОЛ. Надо было слушать Black_mirror, а не лезть заголовочные файлы править.