Ich habe einen Socket-Programmiercode erstellt.C++ Socket-Programmierung: Accept und Recv-Methode blockieren nicht den Prozess
und ich implementiert serverseitige Programm wie folgt:
#include "Common.h"
#include "EP_Test4.h"
int main()
{
printf("Start EP3 \n");
while (1){
EP_Test4 et;
}
return 0;
}
dies ist ein Hauptcode. und wie Sie sehen können, ist eine Codezeile in while-Anweisung. da wird eine Klasse aufgerufen, der Konstruktor in der Klasse wird auch aufgerufen, dann wird die Methode "initEntryPoint()" aufgerufen.
EP_Test4::EP_Test4(){
initEntryPoint();
}
im initEntryPoint Code gibt es eine Einleitung der Buchse Methode (InitCtrlSocket), Verfahren ein Empfangsdaten Verfahren und Schließbuchse.
void EP_Test4::initEntryPoint()
{
printf("[Waiting Restart Signal] \n");
CSocket cCtrlEpSock;
cCtrlEpSock.InitCtrlSocket();
cCtrlEpSock.RecvRestartEPMsg();
cCtrlEpSock.CloseCtrlSocket();
}
Und die Methode sind wie wie folgt implementiert
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();
}
Aber wenn das Programm ausgeführt wird, akzeptiert das Verfahren und die recv Verfahren warten nicht. so gedruckte Nachrichten werden wie unten abgebildet wiederholt.
funktioniert manchmal gut (Warten auf die Blockierungsmethode), manchmal nicht. Ich verstehe nicht, warum das passiert. Wie ich weiß, akzeptieren Methode und Recv-Methode sind die "Blockierung" -Methode. Aber warum blockieren diese Methoden manchmal, manchmal nicht?
Es gibt keine Beweise dafür, dass hier the'accept() 'und' recv() 'Methoden nicht blockieren, Sie aren‘ t Fehlerprüfung des Rückgabewertes von 'recv()'. Ihr Code ist sehr seltsam für einen TCP-Server strukturiert. Sie müssen ein Tutorial lesen und Threads für die akzeptierten Sockets verwenden. Verschwenden Sie nicht Ihre Zeit und unsere Bandbreite, indem Sie hier Bilder von Text veröffentlichen. Veröffentlichen Sie den Text. – EJP