winsock2 не может привязать сокет

Я новичок в winapi (winsocket2). Вот мой полный код (иначе я не могу, поскольку моя программа компилируется, но, похоже, не работает (не связывает функцию привязки сокета, возвращающую -1)).

#include<winsock2.h>
#include<ws2tcpip.h>
#include<stdio.h>
#include<iostream>
using namespace std;
WSADATA sData;
SOCKADDR_IN linker;
SOCKET sSocket;
int main()
{
    if(WSAStartup(MAKEWORD(2,3),&sData)!=0)
    {
        cout<<"Cannot startup WINsocket";
        return -1;
    }
    cout<<"\tWINsocket loaded!\n\n";
    if(sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)
    {
        cout<<"Invalid socket.";
        return -1;
    }
    cout<<"\tSocket loaded!\n\n";
    linker.sin_family=AF_INET;
    linker.sin_addr.s_addr=INADDR_ANY;
    linker.sin_port=htons(3490);
    memset( &( linker.sin_zero ), '\0', 8 );
    char yes='1';
    if( setsockopt( sSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( yes ) ) == - 1 )
    {
        perror( "setsockopt" );
       exit(1);
    }
    if(bind(sSocket,(struct sockaddr*)&linker,sizeof(linker))==SOCKET_ERROR)
        cout<<"lol";

    cout<<"\tSocket succesfully binded!\n\n";
    listen(sSocket,10);
}

Я пробовал это, вставляя прямо перед тем, как привязать

char yes='1';
      if( setsockopt( sSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( yes ) ) == - 1 )
      {
      perror( "setsockopt" );
      exit(1);
      }

но эта функция просто выводит setsockopt: No error и выходит. Спасибо за помощь


person I I    schedule 11.01.2015    source источник
comment
Чтобы получить ошибки WSAErrors: msdn. microsoft.com/en-us/library/windows/desktop/   -  person DDD    schedule 12.01.2015
comment
Ошибка 10038 говорит мне, что я работаю не на сокете, но я   -  person I I    schedule 12.01.2015
comment
perror основан на errno, который, очевидно, также не работает с WinSock. Обратите внимание, что вместо этого вы можете получать текстовые сообщения об ошибках, используя FormatMessage. При работе с WinSock имейте в виду, что это не полная повторная реализация API сокетов Беркли, всегда обращайтесь к документации MSDN, если сомневаетесь.   -  person Ulrich Eckhardt    schedule 12.01.2015


Ответы (2)


Параметр SO_REUSEADDR ожидает параметр типа BOOL, который является typedef для int. Я подозреваю, что передача char вызывает проблему: setsockopt() откажется назначать параметр, если размер последнего параметра не соответствует ожидаемому размеру, что неверно в вашем случае (sizeof(char) != sizeof(BOOL)).

Другими словами, вы можете изменить свой код на это:

BOOL yes = 1;
if( setsockopt( sSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof( yes ) ) == - 1 )
{
   perror( "setsockopt" );
   exit(1);
}
person André Caron    schedule 11.01.2015
comment
Я делаю именно это, и я получаю сообщение об ошибке не может преобразовать bool* в const char* для 4-го аргумента - person I I; 11.01.2015
comment
Вы должны использовать приведение типов: setsockopt(..., (char*)&yes, ...) - person Remy Lebeau; 12.01.2015

if(sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)

Проблема со скобками. Попробуй это:

if((sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
person user207421    schedule 11.01.2015