2013-03-13 59 views
0

我对网络非常陌生,并且在while循环中发送消息时遇到问题。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 软件导致连接中断。 一个已建立的连接被软件在您的主机终止,可能是由于数据传输超时或协议错误

感谢

+0

连接也应该在while循环之外。你能举出一个你遇到问题的例子吗? – Default 2013-03-13 11:07:44

+0

我写了关于winsock [这里](http://stackoverflow.com/a/2920787/238902“C++ Winsock P2P”)的广泛答案。这可能有一些帮助? – Default 2013-03-13 11:09:15

+0

正确的方法是你的第一个例子,它只发送一次,然后返回一个错误。你应该调用[WSAGetLastError](http://msdn.microsoft.com/en-us/library/windows/desktop/ms741580%28v=vs.85%29.aspx)来得到那个错误,这应该给你一个提示至于为什么它失败。你的第二个例子仅仅是因为你是第一个例子_repeating;创建套接字,连接,发送,关闭套接字,回到第一步。 – 2013-03-13 11:27:00

回答

0

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