обертка для функции connect

Тема в разделе "WASM.NETWORKS", создана пользователем vadak, 9 фев 2011.

  1. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Всем привет!
    Подскажите что не так с кодом. Хочу сделать обертку для функции connect но никак не выходит правильно передать структуру sockaddr функции Connect, возвращает -1, хотя со стандарнтной(connect) функцией все нормально коннект есть.

    Код:
    Код (Text):
    1. #include <winsock2.h>
    2. #include <windows.h>
    3. #include <string.h>
    4. #include <stdio.h>
    5. #pragma comment (lib, "Ws2_32.lib")
    6. #define SA struct sockaddr
    7. int Socket(int domain, int type, int protocol)
    8. {
    9. int sock;
    10. sock = socket(domain, type, protocol);
    11. if(sock < 0)
    12.     {
    13.         printf("socket error...!");
    14.         return -1;
    15.     }
    16. return sock;
    17. }
    18. int Connect(int s,struct sockaddr *sin, int len)
    19. {
    20. int c;
    21.  c = connect(s, (SA *)&sin, len);
    22.  if(c < 0)
    23.         printf("connect error...!");
    24. }
    25. int main(void)
    26. {
    27.     int s;
    28.     WSADATA wsd;
    29.     WSAStartup(0x101, &wsd);
    30. s = Socket(AF_INET, SOCK_STREAM, 0);
    31.     struct sockaddr_in sin;
    32.  memset (&sin, 0, sizeof (sin));
    33.  sin.sin_family = AF_INET;
    34.  sin.sin_port = htons (23);
    35.  sin.sin_addr.s_addr = inet_addr("192.168.1.1");
    36.  
    37. Connect(s,(SA *)&sin, sizeof(sin));
    38. }
    И еще вопрос по теме. Изучаю стивенса, в unp.h файле приведены прототипы функций,
    там же есть и Connect, не понятно где находятся сами функции и функции обработки ошибок?
     
  2. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    vadak
    В main ты вызовом Connect(s,(SA *)&sin, sizeof(sin)); передаешь адрес структуры sin. Дальше в самой Connect опять вызываешь c = connect(s, (SA *)&sin, len). Разве нужно (SA *)&sin ? У тебя же там уже лежит адрес структуры sin.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Не надо передавать адрес указателя!
    Да и какой смысл тебе кастовать sockaddr* к sockaddr*? Я так понимаю, ты хотел кастовать sockaddr_in* к sockaddr* (судя по названию sin).
    Тогда нужно так:

    Код (Text):
    1. int Connect(int s,struct sockaddr_in *sin, int len)
    2. {
    3.  int c;
    4.  c = connect(s, (struct sockaddr*) sin, len);
    5.  if(c < 0)
    6.   printf("connect error...!");
    7. }