Сокет не получен от клиента - PullRequest
1 голос
/ 11 февраля 2011
int main()
{
    CRc5 dec;
    WSADATA wsaData;
    int err;
    if((err =WSAStartup(0x0002, &wsaData)) !=0)
    {
        printf("Init WSAStartup() failed[%d].", err);
        return false;
    }
    //socket structure
    SOCKADDR_IN addr;//addr = socket structure
    int addrlen = sizeof(addr);

    //making the socket
    SOCKET sListen;//listenig to the incoming connections
    SOCKET sConnect;//operating the connection

    //setuping the socket
    sConnect=socket(AF_INET,SOCK_STREAM,NULL);//sock_stream = that the socket is a connection_oriented

    //setup the structure
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");// ip of the connection
    addr.sin_family= AF_INET;
    //seting the prot
    addr.sin_port= htons(9958);

    //sertuping Listen socket
    sListen=socket(AF_INET,SOCK_STREAM,NULL);
    //binding connection
    bind(sListen,(SOCKADDR*)&addr,sizeof(addr));
    //listening 
    listen(sListen,SOMAXCONN);//listing with out any limit
    printf("Attempting Socket Connection\n");
    printf("Wating For An Incoming Connection!\n");
    for(;;)
    {
        if((sConnect=accept(sListen,(SOCKADDR*)&addr,&addrlen)) != INVALID_SOCKET)
        {
            char buf[500];
            int len = strlen(buf);
            recv(sConnect,buf,len,0);

        }
        else
        {
            printf("Error accepting %d\n",WSAGetLastError());
        }
    }
}

но он ничего не получает, он принимает сокет от игрового клиента, а затем ничего не происходит, почему !!?

Ответы [ 2 ]

1 голос
/ 15 апреля 2011
         char buf[500];
         int len = strlen(buf);
         recv(sConnect,buf,len,0);

strlen(buf) явно ошибка. Не знаю, является ли это причиной того, что recv() не работает, но вы должны определенно использовать sizeof(buf) вместо.

Вы также должны знать, что recv(socket, buf, 500, 0) не обязательно получит 500 байтов, даже если отправитель отправит 500 байтов. Он может получить только 1 байт или любое число от до 500.

Также он не обязательно будет получать все, что отправитель отправляет с одним send() звонком. Сокет - это просто поток, и у него нет границ сообщения.

Я просто упоминаю эти две вещи, поскольку они являются «ошибками номер один», которые делают новички с сокетами.

0 голосов
/ 11 февраля 2011
{
    if((sConnect=accept(sListen,(SOCKADDR*)&addr,&addrlen)) != INVALID_SOCKET)
    {
        char buf[500];
        int len = strlen(buf);
        recv(sConnect,buf,len,0);

    }

Вероятно, вам не следует повторно использовать addr, чтобы найти адрес входящих соединений. В этом может не быть ничего неправильного , но знание того, что вы использовали одну и ту же переменную для двух разных вещей в вашей программе, становится сложнее с ростом вашей программы. Дайте каждой переменной определенную задачу и используйте переменные только по очень веской причине.

Но проблема, скорее всего, в том, что strlen(buf) позвонит. Ничто не обнулило char buf[500], которое вы выделили в стеке. Ваш strlen() может вернуть 0, если в этом месте случайно находился 0 байт, или он может вернуть 2000, если это количество байтов, которое он должен просмотреть, прежде чем найти 0 байт. , (Я думаю, что-то вроде 12 будет обычным делом. :) Вы можете использовать sizeof buf;, но это может быть хрупким, если вы передумаете в будущем и выделите массив, используя malloc. Поэтому просто используйте константу как для длины в распределении, так и для вызова recv(). Это будет сложнее пропустить, когда вы решите сделать его динамичным в будущем.

...