Winsock没有发送while循环

时间:2013-03-13 11:05:23

标签: c++ windows sockets networking winsock

我对网络很陌生,并且在while循环期间发送消息时遇到问题。

据我所知,我应该按照以下方式做点什么:

Create Socket()
Connect()

While
     Do logic
     Send()
End while

Close Socket()

然而它发送一次并在之后返回-1。

只有在循环中创建套接字时,代码才会起作用。

While
     Create Socket()
     Connect()
     Do logic
     Send()
     Close Socket()
End while

以下是我正在使用但不起作用的代码部分:

//init winsock
WSAStartup(MAKEWORD(2, 0), &wsaData);

//open socket
    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    //connect
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family      = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(ipaddress);
    serveraddr.sin_port        = htons((unsigned short) port);
    connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr));

while(true) {

    if (send(sock, request.c_str(), request.length(), 0)< 0 /*!= request.length()*/) {
        OutputDebugString(TEXT("Failed to send."));
    } else {
        OutputDebugString(TEXT("Activity sent."));
    }
    Sleep(30000);
}
//disconnect
closesocket(sock);

//cleanup
WSACleanup();

函数CheckForLastError()返回:10053

WSAECONNABORTED 软件导致连接中止。 已建立的连接被主机中的软件中止,可能是由于数据传输超时或协议错误

由于

1 个答案:

答案 0 :(得分:0)

要了解程序失败的方式和原因,您必须了解所使用的功能。 其中一些是阻塞功能,有些则不是。其中一些需要以前的其他功能,其中一些不需要。 现在从我的理解,我们在这里谈论的是客户,而不是服务器。 在这种情况下,客户端只有非阻塞功能。这意味着无论何时调用函数,它都将在不等待的情况下执行。 因此send()将在调用它的第二个数据时发送数据,然后流将继续执行下一行代码。 如果要发送的信息尚未准备好......您将遇到问题,因为不会发送任何内容。 要解决它,你可以使用某种延迟。延迟的问题在于它们是阻塞功能,这意味着一旦遇到延迟,您的流就会停止。要解决此问题,您可以创建一个线程并锁定它,直到信息准备好发送。 但是那可以完成一个send()的工作。您将发送信息,那就是那些。 如果要保持通信并重复发送信息,则需要创建一个while循环。一旦你有一个while循环,你不必担心任何事情。这是因为您可以通过流控制验证信息已准备就绪,并且可以在终止连接之前反复使用发送。 现在问题是服务器端发生了什么? “ipaddress”应该保存服务器的IP。服务器可能会拒绝您的连接请求。或者最糟糕的是他可能会接受您的请求,但他正在倾听与您的客户有关的不同设置。意思是服务器可能没有恢复(没有recv()函数)信息而您是试图发送信息...可能会在错误/崩溃中失败,什么不是。