windows - Modtagelse af flere meddelelser Winsock2 C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at lave et program ved hjælp af Winsock2, hvor jeg kan sende en besked fra klient til server. Jeg kan gøre dette, men problemet er, at jeg kun kan sende en besked, og så skal jeg genstarte serveren for at modtage den næste besked. Her er koden til serveren. Den del, jeg er virkelig forvirret om, er, at jeg har funktionen recv() i en while loop, hvorfor hvorfor fortsætter det med at 'modtage' data?


   WSADATA wsaData;
    int bytes\_recieved;
    char data\_recieve[2048];
    string output;

    WSAStartup(MAKEWORD(2, 2), &wsaData);
    SOCKET ListenSocket = socket(AF\_INET, SOCK\_STREAM, IPPROTO\_TCP);

    SOCKADDR\_IN ServerInfo;
    ServerInfo.sin\_family = AF\_INET;
    ServerInfo.sin\_addr.s\_addr = INADDR\_ANY;
    ServerInfo.sin\_port = htons(8888);

    bind(ListenSocket, (LPSOCKADDR)&ServerInfo, sizeof(struct sockaddr));
    listen(ListenSocket, 1);
    SOCKET ClientSocket = accept (ListenSocket, NULL, NULL);

    while(true)
    {
        bytes\_recieved = recv(ClientSocket, data\_recieve, 2048, 0);
            if (bytes\_recieved > 1)
            {
                cout << data\_recieve;
            }
    }

    closesocket(ClientSocket);
    closesocket(ListenSocket);
    WSACleanup();


Klienten (afsender) er angivet nedenfor.


WSADATA wsaData;
int bytes\_sent;
char send\_msg[] = "super cool message!";

WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET ConnectSocket = socket(AF\_INET, SOCK\_STREAM, IPPROTO\_TCP);
sockaddr\_in ConnectInfo;

ConnectInfo.sin\_family = AF\_INET;
ConnectInfo.sin\_addr.s\_addr = inet\_addr("127.0.0.1");
ConnectInfo.sin\_port = htons(8888);

connect(ConnectSocket, (SOCKADDR*)&ConnectInfo, sizeof(ConnectInfo));
bytes\_sent = send(ConnectSocket, send\_msg, sizeof(send\_msg), 0);
closesocket(ConnectSocket);
WSACleanup();


Jeg laver dette i Windows 7 med en MinGW compiler. Tak på forhånd.

Bedste reference


Du viste ikke din klientens afsendelseskode, men din server læsekode tager ikke højde for, at sende og modtage ikke er 1 til 1 i TCP/IP programmering. Hvis en klient sender 2 meddelelser, kan serveren modtage begge meddelelser eller endda dele af dem i samme læsning! Du ae fortæller din server socket for at læse 2048 bytes ad gangen. Det vil returnere, hvad der for øjeblikket er tilgængeligt på stikket i det øjeblik. TCP/IP er en byte strøm, du skal behandle det så meget. Det betyder, at du enten skal sætte en afgrænsning mellem dine beskeder eller placere en ramme omkring dem for at vide, hvor en meddelelse slutter, og den næste besked begynder.