Почему после strcpy_s я получаю отладочное утверждение? - PullRequest
2 голосов
/ 07 февраля 2010

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

// portlookup.cpp
// Given a service name, this program displays the corresponding port number.

#include <iostream>
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
using namespace std;

int main (int argc, char **argv)
{
    char    service[80];    // This string contains name of desired service
    struct  servent *pse;   // pointer to service information entry
    short   port;           // Port # (in Network Byte Order) of desired service

    if (argc < 2)
    {
        cout << "Please specify a service." << endl;

    }

    strcpy_s(service, sizeof(service), argv[1]);

    WORD wVersion = 0x0202;
    WSADATA wsaData;
    int iResult = WSAStartup(wVersion, &wsaData);  // Returns zero if successful
    if (iResult != 0) {
        cout << "Insufficient resources to startup WINSOCK." << endl;
        return 0;
    }

    port = htons( (u_short) atoi(service)); // 1st try to convert string to integer
    if (port == 0) {                        // if that doesn't work, call service function
        pse = getservbyname(service,NULL);
        if (pse) {
            port = pse->s_port;
        }
        else
        {
            cout << "Invalid service request." << endl;
            return INVALID_SOCKET;
        }
    }

    cout << "Service: " << service << endl;
    cout << "Port:    " << htons(port) << endl;

}

Ответы [ 4 ]

2 голосов
/ 07 февраля 2010

Ваша проблема заключается в том, что вы не передаете командную строку, вы проверяете argc <2, но когда он равен <2, вы в любом случае выполняете strcpy_s. </p>

В Visual Studio перейдите в диалоговое окно свойств проекта, оттуда перейдите на страницу Отладка и добавьте имя службы в Аргументы команд

И исправьте свой код проверки аргументов

if (argc < 2)
{
    //cout << "Please specify a service." << endl;
    cerr << "error: no service specified." << endl;
    return EXIT_FAILURE; // return some non-zero value to indicate failure.
}
2 голосов
/ 07 февраля 2010

Вам нужно запустить программу с аргументом.В строке strcpy_s(service, sizeof(service),argv[1]); предполагается, что вы указали аргумент программы 1, который будет сохранен в argv [1].

Если вы не запустите его с какими-либо аргументами, argv [1] будет иметь значение NULL, и ваша программа вылетит.

1 голос
/ 07 февраля 2010

Не забудьте выйти, если не указан параметр.

if (argc < 2) 
{ 
    cout << "Please specify a service." << endl; 
    return 0; // exit! 
} 
0 голосов
/ 07 февраля 2010

также

port = htons( (u_short) atoi(service));
...
cout << htons(port);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...