C++循环中的WINSOCK传输

WINSOCK transmission in C++ loop

我是运行一个服务器客户端winsock软件,用于从客户端到服务器循环传输数据。第一次传输没有问题,完美。 第二个传输等等都损坏了,我不知道它是关于保持活力还是别的什么。我花了 2 天时间想弄明白。

服务器端

#include"stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include<Windows.h>
#include <time.h>
#include"iostream"
#include"string"
#define MAXLINE 1000
int main()
{
    // Initialize Winsock
    WSADATA wsaData;
    std::string message;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR)
        printf("Server: Error at WSAStartup().\n");
    // Create a SOCKET for listening for incoming connection requests.
    SOCKET sockListen;
    sockListen = socket(AF_INET, SOCK_STREAM, 0);
    if (sockListen == INVALID_SOCKET)
    {
        printf("Server: Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 0;
    }
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    struct sockaddr_in servAddr;
    memset(&servAddr, 0, sizeof (servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(5000); /* daytime server */
    if (bind(sockListen, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
    {
        printf("Server: bind() failed.\n");
        closesocket(sockListen);
        return 0;
    }
    // Listen for incoming connection requests on the created socket
    if (listen(sockListen, 1) == SOCKET_ERROR)
        printf("Server: listen(): Error listening on socket.\n");
    printf("Server: I'm listening on socket, waiting for connection...\n");

    SOCKET sockConn;

    char recvbuff[MAXLINE];

    while (1)
    {
        sockConn = accept(sockListen, NULL, NULL);

        recv(sockConn, recvbuff, MAXLINE, 0);
        message = recvbuff;
        printf("%s \n", message);
        std::cout << WSAGetLastError();
        Sleep(100);
        memset(recvbuff, 0, MAXLINE * (sizeof recvbuff[0])); 
    }
    WSACleanup();

    return 0;
}

客户端

#include"stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include<Windows.h>
#include <time.h>
#include"iostream"
#define MAXLINE 1000
int main()
{
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR)
        printf("Client: Error at WSAStartup().\n");
    // Create a SOCKET to connect to Server.
    SOCKET sockClient;
    sockClient = socket(AF_INET, SOCK_STREAM, 0);
    if (sockClient == INVALID_SOCKET)
    {
        printf("Client: Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 0;
    }
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    struct sockaddr_in servAddr;
    char servHost[16];
    memset(&servAddr, 0, sizeof (servAddr));
    printf("Enter Host IP: ");
    scanf("%s", servHost);
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr(servHost);
    servAddr.sin_port = htons(5000); /* daytime server */
    // Connect to a server.
    if (connect(sockClient, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
    {
        printf("Client: connect() - Failed to connect.\n");
        WSACleanup();
        return 0;
    }
    char buff[MAXLINE];

    // Read data from server and display
    connect(sockClient, (SOCKADDR*)&servAddr, sizeof(servAddr));

    for (int x = 0; x < 100; x++)
    {

    sprintf(buff, "transmission number  %d",x);
    send(sockClient, buff, strlen(buff), 0);
    memset(buff, 0, MAXLINE * (sizeof buff[0]));
    Sleep(3000);

    }

    closesocket(sockClient);
    WSACleanup();
    closesocket(sockClient); 

    return 0;
}

问题是我不需要做循环

sockConn = accept(sockListen, NULL, NULL);

只是在服务器循环解决和问题解决之前就把它解决了,即使我不确定为什么