This function or variable may be unsafe - C (СИ)

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «This function or variable may be unsafe»

textual
Листинг программы
  1. int WINAPI WinMain(      
  2.     HINSTANCE hInstance,
  3.     HINSTANCE hPrevInstance,
  4.     LPSTR lpCmdLine,
  5.     int nCmdShow
  6. );

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут