Я создаю код программирования сокета.Программирование сокетов C++: метод Accept и Recv не блокирует процесс
и я реализовал на стороне сервера программы следующим образом:
#include "Common.h"
#include "EP_Test4.h"
int main()
{
printf("Start EP3 \n");
while (1){
EP_Test4 et;
}
return 0;
}
это является основной код. и, как вы видите, строка кода находится в while-statement. , вызывается класс, также вызывается конструктор в классе, затем вызывается метод initEntryPoint().
EP_Test4::EP_Test4(){
initEntryPoint();
}
в коде initEntryPoint, есть инициация методы сокета (InitCtrlSocket), способ приема данных и закрытие сокета метода.
void EP_Test4::initEntryPoint()
{
printf("[Waiting Restart Signal] \n");
CSocket cCtrlEpSock;
cCtrlEpSock.InitCtrlSocket();
cCtrlEpSock.RecvRestartEPMsg();
cCtrlEpSock.CloseCtrlSocket();
}
И те, метод реализуются как следующим
void CSocket::InitCtrlSocket(){
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("error\r\n");
}
if ((EpCtrlServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
{
perror("socket error : ");
exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(6870);
if (bind(EpCtrlServerSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
perror("bind error: ");
exit(1);
}
if (listen(EpCtrlServerSocket, 5)<0)
{
perror("listen error : ");
exit(1);
}
EpCtrlClientSocket = accept(EpCtrlServerSocket, (struct sockaddr *)&client_addr, &clen);
}
void CSocket::RecvRestartEPMsg(){
char arrRecvCompleteMsg[50];
memset(&arrRecvCompleteMsg, 0, sizeof(arrRecvCompleteMsg));
int data_len = recv(EpCtrlClientSocket, (char*)&arrRecvCompleteMsg, sizeof(arrRecvCompleteMsg), 0);
cout << "RECV CTRL MSG : " << arrRecvCompleteMsg << endl;
}
void CSocket::CloseCtrlSocket(){
closesocket(EpCtrlServerSocket);
closesocket(EpCtrlClientSocket);
WSACleanup();
}
Но когда программа выполняется, принимают метод и метод RECV не ждут. поэтому печатные сообщения повторяются, как показано ниже.
иногда работает хорошо (ожидание при блокировании), иногда нет. Я не понимаю, почему это происходит. Как я знаю, метод accept и recv - это метод блокировки. Но почему эти методы иногда блокируют, иногда нет?
Там нет никаких доказательств того, что здесь the'accept() 'и' RECV() 'методы не блокируют, вы Арен» t проверка ошибок возвращаемого значения 'recv()'. Ваш код очень странно структурирован для TCP-сервера. Вам необходимо проконсультироваться с учебником и использовать потоки для принятых сокетов. Не тратьте свое время и свою пропускную способность, публикуя здесь текст с текстом. Отправьте текст. – EJP