C++ C+中的WINSOCK传输+;环

C++ C+中的WINSOCK传输+;环,c++,winsock,C++,Winsock,我正在运行一个服务器-客户端winsock软件,以循环方式在客户端和服务器之间传输数据。在第一次传输中没有问题,它是完美的。 第二次传输等都被破坏了,我不知道这是关于保持活力还是其他什么。我花了两天时间想弄明白 服务器端 #include"stdafx.h" #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include<Windows.h> #include <ti

我正在运行一个服务器-客户端winsock软件,以循环方式在客户端和服务器之间传输数据。在第一次传输中没有问题,它是完美的。 第二次传输等都被破坏了,我不知道这是关于保持活力还是其他什么。我花了两天时间想弄明白

服务器端

#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;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括“iostream”
#包括“字符串”
#定义MAXLINE 1000
int main()
{
//初始化Winsock
WSADATA WSADATA;
std::字符串消息;
int-iResult=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(iResult!=无错误)
printf(“服务器:WSAStartup()处出错。\n”);
//创建用于侦听传入连接请求的套接字。
插座插座;
sockListen=socket(AF_INET,SOCK_STREAM,0);
if(sockListen==无效的_套接字)
{
printf(“服务器:套接字()处出错:%ld\n”,WSAGetLastError());
WSACleanup();
返回0;
}
//结构中的sockaddr_指定地址族,
//要绑定的套接字的IP地址和端口。
servAddr中的结构sockaddr_;
memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family=AF_INET;
servAddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
servAddr.sin_port=htons(5000);/*日间服务器*/
if(bind(sockListen,(SOCKADDR*)&servAddr,sizeof(servAddr))==SOCKET\u错误)
{
printf(“服务器:bind()失败。\n”);
闭合插座(插座);
返回0;
}
//在创建的套接字上侦听传入的连接请求
if(listen(sockListen,1)=套接字错误)
printf(“服务器:侦听():侦听套接字时出错。\n”);
printf(“服务器:我正在监听套接字,等待连接…\n”);
插座插座;
char recvbuff[MAXLINE];
而(1)
{
sockConn=accept(sockListen,NULL,NULL);
recv(sockConn,recvbuff,MAXLINE,0);
message=recvbuff;
printf(“%s\n”,消息);

问题是我不需要做循环

sockConn = accept(sockListen, NULL, NULL);

把它放在服务器循环解决和问题解决之前,我不知道为什么你能添加更多关于“损坏的第二次传输”的详细信息?你到底看到了什么?当你从系统调用中得到错误时,打印一些你自己设计的随机文本是不够的。你必须至少调用
peror()
,或使用
errno
strerror()
在一条错误消息中,在调用任何其他系统调用之前。当您这样做并且有一些有用的消息时,请将它们编辑到您的问题中。实际上,我从客户端收到了错误0,用于传输,这意味着没有错误,并且我只从服务器读取了一次,循环不再像停止或其他什么那样工作,因为您要接受连接并读取其所有输入。因此将
accept()
放在循环中是没有意义的。您应该启动一个新线程来为每个接受的套接字执行I/O。
sockConn = accept(sockListen, NULL, NULL);