связь с несколькими клиентами с многопоточностью на стороне клиента и на стороне сервера с использованием сокетов c

#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() , не инициализируя его чем-либо.