Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
16 / 16 / 4
Регистрация: 03.02.2010
Сообщений: 219
1

This function or variable may be unsafe

17.02.2010, 16:57. Показов 2296. Ответов 12
Метки нет (Все метки)

Всем привет! проблема такая, клиент-серверное приложение было изначально написано под unix. я решил переделать его под windows! приложение реализовано на winsock. соответственно поменял заголовочные файлы, переписал функции! из 15 ошибок, которые выдавал компилятор остались 1 предупреждение и одна ошибка следующего содержания:

1) warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
2) error C2664: 'recv' : cannot convert parameter 2 from 'char (*)[21]' to 'char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

вот код программы:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <winsock.h>
#pragma comment (linker,"WSock32.Lib",lib)
 
extern errno;     //глобальная переменная, которая хранит код последней ошибки
 
//проверка, задан ли шаблон INADDR_NONE, который обозначает сразу все доступные сетевые интерфейсы
//на некоторых платформах, он может быть не задан.
#ifndef INADDR_NONE
#define INADDR_NONE 0xfffffffff
#endif
 
//функция создания и связывания сокета. объявление
//аргументы:
//port - порт, с которым связывается сервер
//transport - протокол, по которому будет работать сервер (tcp или udp)
//qlen - длина  очереди
int sock(const char *port, const char *transport, int qlen);
 
//главная функция
int main()
{
    int msock, csock;                //дескрипторы сокетов
    struct sockaddr_in  remaddr;            //структура IP-адреса клиента
    unsigned int remaddrs = sizeof(remaddr);    //размер структуры адреса
    char msg[21];                    //буфер сообщения
    
    msock = sock("1231", "tcp", 5);    //создаем tcp сокет и привязываем его к порту 3123, задав очередь 5
    if(msock < 0)            //проверяем значение дескриптора сокета
        return -1;        //завершаем программу
 
    while(1)    //бесконечный цикл
    {
        csock = accept(msock, (struct sockaddr*) &remaddr, &remaddrs);    //принимаем входящее подключение, адрес клиента в remaddr
        if(csock < 0)        //проверяем результат
            printf("Ошибка принятия подключения: %s\n", strerror(errno)); //сообщение об ошибке
        else            //если все нормально - начинаем обмен данными с клиентом
            {
                if(read(csock, &msg, sizeof(msg)) >0 )        //пробуем читать данные от клиента
                {
                    if(strstr(msg, "hello"))            //если получено "hello"
                    {
                        memset(&msg, 0, sizeof(msg));            //обнуляем буфер
                        strcpy(msg, "hello, ");                //формируем строку ответа
                        strcat(msg, inet_ntoa(remaddr.sin_addr));    //преобразовываем адрес клиента в строку
                        strcat(msg, " !!!\n\0");            //завершаем строку ответа
                        write(csock, msg, sizeof(msg));            //отсылаем ответ
                    }
                }
                close(csock);        //закрываем сокет клиента
            }
    }    
    close(msock);        //закрываем сокет сервера
    return 0;
}
//функция создания и связывания сокета. реализация
int sock(const char *port, const char *transport, int qlen)
{
    struct protoent *ppe;        
    struct sockaddr_in sin;
    int s, type;
    //обнуляем структуру адреса
    memset(&sin, 0, sizeof(sin));
    //указываем тип адреса - IPv4, для IPv6 необходимо указать AF_INET6
    sin.sin_family = AF_INET;
    //указываем, в качестве адреса, шаблон INADDR_ANY - все сетевые интерфейсы
    sin.sin_addr.s_addr = INADDR_ANY;
    //задаем порт
    sin.sin_port = htons((unsigned short)atoi(port));
    //преобразовываем имя транспортного протокола в номер протокола
    if((ppe = getprotobyname(transport)) == 0)
        {
            printf("Ошибка преобразования имени транспортного протокола: %s\n", strerror(errno));    //в случае неудачи выводим сообщение ошибки
            return -1;        
        }
    //используем имя протокола для определения типа сокета     
    if(strcmp(transport, "udp") == 0)
        type = SOCK_DGRAM;
    else
        type = SOCK_STREAM;    
    //создаем сокет
    s = socket(PF_INET, type, ppe->p_proto);
    if(s < 0)
        {
            printf("Ошибка создания сокета: %s\n", strerror(errno));    //в случае неудачи выводим сообщение ошибки
            return -1;
        }
    //привязка сокета с проверкой результата
    if(bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
        {
            printf("Ошибка связывания сокета: %s\n", strerror(errno));    //в случае неудачи выводим сообщение ошибки
            return -1;
        }
    //запуск прослушивания с проверкой результата
    if(type == SOCK_STREAM && listen(s, qlen) <0)
        {
            printf("Ошибка прослушивания сокета: %s\n", strerror(errno));    //в случае неудачи выводим сообщение ошибки
            return -1;
        }
    return s;    //возвращаем дескриптор сокета
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2010, 16:57
Ответы с готовыми решениями:

Ошибка программы: This function or variable may be unsafe
Ошибка 1 error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s...

Error C4996: 'scanf': This function or variable may be unsafe
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To...

Warning C4996: 'scanf': This function or variable may be unsafe
#include&lt;stdio.h&gt; #include&lt;math.h&gt; void main() { int a,b,c ; printf(&quot;Enter a&quot;); scanf(&quot;%d&quot; ,...

Ошибка 1 error C4996: 'fopen': This function or variable may be unsafe
есть такой код: // Лабораторная №5.cpp: определяет точку входа для консольного приложения. // ...

12
Автор FAQ
3684 / 961 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
17.02.2010, 17:46 2
1. Всего лишь предупреждение о том что использование этой функции небезопасно т.к. она может выйти за пределы посылаемого ей массива. Предлогается использовать вместо неё strerror_s. Но можно забить

2. Я не вижу у вас в коде переменной 'recv' но допустим что где то так
C++
1
2
char recv[21];
func(recv);
Чтобы послать char* (что и требует компилятор)
нужно написать так
C++
1
func(&recv[0]);
Цитата Сообщение от al072 Посмотреть сообщение
из 15 ошибок, которые выдавал компилятор остались 1 предупреждение и одна ошибка следующего содержания
иногда бывает исправишь ещё 347 вылезет)
0
Эксперт С++
5027 / 2606 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
18.02.2010, 15:35 3
insideone, recv - это функция из winsock
0
Автор FAQ
3684 / 961 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
18.02.2010, 16:37 4
2 fasked да, тупанул по невнимательности. Ну в общем в эту функцию нужно посылать параметр так как я описал выше. А именно дописать к нему вначале & и в конце [0]. Так?
0
Эксперт С++
7175 / 3234 / 79
Регистрация: 17.06.2009
Сообщений: 14,164
19.02.2010, 09:28 5
1) warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
До включения стандартных #include выставить макрос
#define _CRT_SECURE_NO_WARNINGS 1
0
503 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
19.02.2010, 22:42 6
Всё дело в том, что unix-образные системы использубт tstring. Его можно сконвертить в string при помощи функции c_str() или string st; st = std::string(wst.begin(), wst.end()), где wst - tstring.
0
16 / 16 / 4
Регистрация: 03.02.2010
Сообщений: 219
02.03.2010, 10:56  [ТС] 7
Отключил вывод предупреждений вышеуказанным способом!есть еще 2 ошибки, просьба подскажите что с ними делать:

LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

fatal error LNK1120: 1 unresolved externals
0
503 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
02.03.2010, 13:36 8
На самом деле ошибка одна, но какая. Поздраляю, у тебя winmain не слинковался. Что делать - не знаю. Может, пересоздать проект.
0
16 / 16 / 4
Регистрация: 03.02.2010
Сообщений: 219
02.03.2010, 21:07  [ТС] 9
Цитата Сообщение от Airhand Посмотреть сообщение
На самом деле ошибка одна, но какая. Поздраляю, у тебя winmain не слинковался. Что делать - не знаю. Может, пересоздать проект.
Если не трудно, можно обьяснить что это означает? по какой причине он мог не слинковаться?
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
02.03.2010, 23:07 10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

посмотри точку входу в свойствах проекта
Если не трудно, можно обьяснить что это означает? по какой причине он мог не слинковаться?
у тебя линковщик считает, что точка входа программы
C++
1
2
3
4
5
6
int WINAPI WinMain(      
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);
, но не может найти подобной функции у тебя, отсюда и ошибка (ты же ведь полагаешь, что точка входа - int main())
в студии в свойствах проекта Linker->Sybsystem->Console (/SUBSYSTEM:CONSOLE)
0
16 / 16 / 4
Регистрация: 03.02.2010
Сообщений: 219
02.03.2010, 23:13  [ТС] 11
Цитата Сообщение от alex_x_x Посмотреть сообщение
может просто wmain( int, char** ) попробовать?
посмотри точку входу в свойствах проекта
где в свойствах можно посмотреть точку входа?
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
02.03.2010, 23:15 12
пост выше
у тебя там стоит Windows (/SUBSYSTEM:WINDOWS) должно быть
0
16 / 16 / 4
Регистрация: 03.02.2010
Сообщений: 219
03.03.2010, 08:24  [ТС] 13
Спасибо большое! слинковал удачно..
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2010, 08:24

Ошибка: error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.
подскажите плиз в чем проблема? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; int...

Исправить множественные ошибки типа "This function or variable may be unsafe"
помогите исправить апшибки :) #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt;...

Error C4996: 'fopen': This function or variable may be unsafe
уважаемые программисты, ранее мне не приходилось сталкиваться с записью в файл. написала, как мне...

This function or variable may be unsafe
Здорова господа! Скачал визуал студио 2013 премиум и в общем весь старый код пишет с ошибками...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru