#c #multithreading #sockets #tcp #client-server
#c #многопоточность #сокеты #tcp #клиент-сервер
Вопрос:
Я создал клиентскую и серверную программу с использованием сокетов. На стороне сервера я выполнил многопоточность, чтобы каждому клиенту был назначен отдельный поток. На стороне клиента я хочу, чтобы каждому клиенту был назначен поток. Например, если есть 1000 клиентов, которые хотят взаимодействовать с сервером, тогда должно быть создано 1000 потоков, но здесь в моем коде я получаю сообщение об ошибке «Ошибка C2561’receive’: функция должна возвращать значение». Я не знаю, что я делаю не так. Может кто-нибудь просто помочь мне? И правильный ли этот код? Я имею в виду, правильно ли я выполняю многопоточность?
Ответ №1:
DWORD WINAPI receive(LPVOID lpParam)
Вы объявили эту функцию как возвращающую a DWORD
.
return;
Но здесь вы не возвращаете значение, как вам объяснено в сообщении об ошибке. Если вы объявляете функцию, которая возвращает некоторое значение, a DWORD
или что-либо еще, то это то, что вы должны возвращать из функции в каждом return
операторе. Измените этот return
оператор, чтобы вернуть DWORD
значение, и добавьте его в конце этой функции.
Эта функция также завершается без return
оператора. Это также проблема, которую вы должны решить таким же образом. Вам нужно выяснить, что ваша функция должна возвращать в каждом случае, и соответствующим образом изменить свой код.
Комментарии:
1. Эта ошибка была удалена, но теперь я получаю сообщение об ошибке «Ошибка C4700 используется неинициализированная локальная переменная ‘clientsock'». Не могли бы вы сказать мне, правильный ли мой код или нет?
2. Это сообщение об ошибке также, в значительной степени, не требует пояснений. Это правда, что C имеет репутацию выдающего непонятное сообщение об ошибке. Но эти довольно понятны и проще. Не могу придумать никакого способа сделать «используемую неинициализированную локальную переменную» более понятной. Показанный код объявляет
SOCKET clientsock;
, а затем передает object в качестве параметраCreateThread()
, не инициализируя его чем-либо.