Клиент не может подключиться - PullRequest
2 голосов
/ 22 июня 2011

Я новичок / начинающий программист, испытывающий проблемы с работой некоторого простого клиентского / серверного кода C.Моя конечная цель - отправить «поток» данных азимута / высоты с сервера клиенту, а затем преобразовать эти данные по мере их получения (это будет просто деление, но я не знаю, как это сделатьлибо) в данные о положении устройства панорамирования / наклона, а затем вывести преобразованные данные через последовательный порт на головку панорамирования / наклона.(Я, вероятно, вернусь, чтобы спросить об этом позже ...)

Сейчас я просто пытаюсь выяснить, как получать и отправлять данные.Я взял код с этого сайта.http://www.tenouk.com/Winsock/Winsock2example3.html. Мне пришлось переместить несколько объявлений, чтобы получить код для компиляции.

Я использую Windows 7 и VS2010 professional на клиентском ПК.Между клиентом и сервером нет маршрутизатора (они напрямую подключены через Ethernet).

Используя отладчик, я обнаружил, что застрял на этом этапе.

clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("12.266.66.255");
clientService.sin_port = htons(55555);

if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
    printf("Client: connect() - Failed to connect.\n");
    WSACleanup();
    return 0;
}

else
{
   printf("Client: connect() is OK.\n");
   printf("Client: Can start sending and receiving data...\n");
}

Я всегда получаю сообщение «Не удалось подключиться», и я не знаю почему.Я использую правильный IP-адрес хост-компьютера (я изменил его перед установкой здесь).

Если это плохой пример, я готов начать с другого примера.Я попробовал несколько примеров «эха», обычно встречающихся в Интернете, и у меня возникают похожие проблемы.Я могу дать больше информации о моих общих целях программы, если это поможет.Остальная часть кода клиента приведена ниже.Я использую код сервера (с перемещением объявлений) по той же ссылке.Спасибо.

int main()
{

int m_socket;

struct sockaddr_in clientService;

int bytesSent;

int bytesRecv = SOCKET_ERROR;
// Be careful with the array bound, provide some checking mechanism...
char sendbuf[200] = "This is a test string from client";
char recvbuf[200] = "";
// Initialize Winsock.

WSADATA wsaData;

int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
          printf("Client: Error at WSAStartup().\n");
else
          printf("Client: WSAStartup() is OK.\n");

// Create a socket
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
{
    printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
    WSACleanup();
    return 0;
}

else
   printf("Client: socket() is OK.\n");

// Connect to a server.
// Just test using the localhost, you can try other IP address
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("12.233.21.254");
clientService.sin_port = htons(55555);

if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
    printf("Client: connect() - Failed to connect.\n");
    WSACleanup();
    return 0;
}

else
{
   printf("Client: connect() is OK.\n");
   printf("Client: Can start sending and receiving data...\n");
}

// Send and receive data.
   // Receives some test string to server...

   while(bytesRecv == SOCKET_ERROR)
   {
       bytesRecv = recv(m_socket, recvbuf, 200, 0);

    if (bytesRecv == 0 || bytesRecv == WSAECONNRESET)
    {
         printf("Client: Connection Closed.\n");
        break;
    }

    if (bytesRecv < 0)
        return 0;

   else
   {
          printf("Client: recv() is OK.\n");
          printf("Client: Received data is: \"%s\"\n", recvbuf);
          printf("Client: Bytes received is: %ld.\n", bytesRecv);

   }

}

   // Sends some test data to server...
   bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);

   if(bytesSent == SOCKET_ERROR)
          printf("Client: send() error %ld.\n", WSAGetLastError());

   else
   {
          printf("Client: send() is OK - Bytes sent: %ld\n", bytesSent);
          printf("Client: The test string sent: \"%s\"\n", sendbuf);
   }

WSACleanup();

return 0;

}

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Ваш оригинальный код (очевидно, после того, как я изменил IP и порт) подключился к моему веб-серверу просто отлично, но я немного его подправил (ниже).

Хотя это может быть немного, CSocketServer содержит множество хороших старых кодов WinSock, которые были проверены и подтверждены.

В любом случае, этот код подключен к моему локальному веб-серверу, отправил элементарный запрос и получил ответ.

int WSATest()
{
    // Initialize Winsock.
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR)
    {
        printf("Client: Error at WSAStartup().\n");
        return 0;
    }

    // Create a socket
    SOCKET m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (m_socket == INVALID_SOCKET)
    {
        printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 0;
    }
    else {
        printf("Client: socket() is OK.\n");
    }

    struct sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(9990);

    //Connect to the remote peer:
    if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
    {
        printf("Client: connect() - Failed to connect.\n");
        WSACleanup();
        return 0;
    }
    else
    {
        printf("Client: connect() is OK.\n");
        printf("Client: Can start sending and receiving data...\n");
    }

    //Very, very basic HTTP request.
    int iSendResult = send(m_socket, "GET / \n\n", 8, 0);
    if(iSendResult == SOCKET_ERROR)
    {
        printf("Failed to send data, error %d.\n", WSAGetLastError());
        return 0;
    }

    while(true)
    {
        char sRecvBuffer[200];
        int iRecvResult = recv(m_socket, sRecvBuffer, sizeof(sRecvBuffer) - 1, 0);

        if(iRecvResult <= SOCKET_ERROR)
        {
            printf("Failed to receive data, error %d.\n", WSAGetLastError());
            break;
        }
        else if(iRecvResult == 0)
        {
            //Graceful disconnect.
            break;
        }
        else {
            //Be sure to terminate the buffer.
            sRecvBuffer[iRecvResult] = '\0';
        }

        printf("Received: [%s] for [%d] bytes.\n", sRecvBuffer, iRecvResult);
    }

    WSACleanup();

    return 0;
}

int main()
{
    WSATest();
    system("Pause");
}
1 голос
/ 22 июня 2011

Почему бы не добавить WSAGetLastError() для проверки фактической ошибки?

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