Сокет сервера C принимает клиентов без запроса - PullRequest
1 голос
/ 19 января 2012

Я сделаю все просто.
Код:

    #include "stdafx.h"
    #include <winsock2.h>
    #include <conio.h>
    #include <iostream>
    #include <stdio.h>
    #include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsadata;
    int error = WSAStartup(0x0202, &wsadata);
    if(error) printf("WinSock error!");
    SOCKET server;
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(5657);
    server_addr.sin_addr.s_addr = htonl (INADDR_ANY); 
    server = socket(AF_INET, SOCK_STREAM, 0);
    if (server == INVALID_SOCKET) printf("INVALID SOCKET!");
    error = bind(server, (LPSOCKADDR)&server_addr, sizeof(server_addr));
    if(error) printf("Connect Error!");
    listen(server, SOMAXCONN);
    printf("SERVER ESTABLISHED! LISTENING...\n");
    sockaddr_in client_addr;
    SOCKET client;
    client = accept(server, (struct sockaddr*)&client_addr, (int *)sizeof(client_addr));
    if(client==INVALID_SOCKET) printf("INVALID SOCKET!\n");
    printf("A CLIENT!");
    closesocket(server);
    WSACleanup();
    getch();
    return 0;
}


Но то, что я получаю, это:

СЕРВЕР УСТАНОВЛЕН! СЛУШАТЬ ... НЕПРАВИЛЬНАЯ РОЗЕТКА! КЛИЕНТ!

Я сделал сокеты в C #, и я предполагаю, что сервер должен прослушивать и ждать клиента, и всякий раз, когда клиент запрашивает соединение, сервер должен принять его, но сервер принимает сокет без ожидания, этот принятый сокет тоже недействителен! Почему это происходит и как я могу это решить?

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Это:

(int *)sizeof(client_addr)

неверно, вы приводите размер к указателю.

socklen_t client_addr_len = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_len);
1 голос
/ 19 января 2012

Возможно, проблема в том, что accept попытается записать последний предоставленный аргумент.

Изменить на:

int client_addr_size = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_size);

Проверка значения WSAGetLastError предоставит причину сбоя.

1 голос
/ 19 января 2012
(int *)sizeof(client_addr)

Вы преобразуете размер client_addr в int *, поэтому у вас есть указатель, указывающий на адрес, равный размеру вашего client_addr.1004 *

socklen_t clntAddrLen = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &clntAddrLen);

Этот способ отличается тем, что у вас есть переменная типа socklen_t, которая содержит размер вашего client_addr.Затем вы получаете указатель (с &), который указывает на адрес памяти, в котором содержится это число, и это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...