关于Winsock的一个问题 [英] A Question About Winsock

查看:88
本文介绍了关于Winsock的一个问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚开始玩winsock。然而,我遇到了一些障碍。使用下面的代码如何在客户端接受来自服务器的多次传输时保持客户端运行。我试图自己解决这个问题,但我不确定如何这样做。

I've just recently started playing around with winsock. I have however ran into a bit of a snag. How would one using the code below keep the client running while it accepts multiple transmissions from the server. I've tried to fix this myself however I am uncertain on how to do so.

int client(string ip)
{
	// Initialise Winsock
	WSADATA WsaDat;
	WSAStartup(MAKEWORD(2,2),&WsaDat);
	
	SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	struct hostent *host;

	// Socket stuff
	SOCKADDR_IN SockAddr;
	SockAddr.sin_port=htons(8888);
	SockAddr.sin_family=AF_INET;
	SockAddr.sin_addr.s_addr= inet_addr(ip.c_str());

	if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr))!=0)
	{
		std::cout<<"Failed to establish connection with server\r\n";
		WSACleanup();
		system("PAUSE");
		return 0;
	}

	// Display message from server
	char *data = new char[1001];
	memset(data,0,1000);

	int inDataLength=recv(Socket,data,1000,0);
	cout << data << endl;

	shutdown(Socket,SD_SEND);
	closesocket(Socket);
	WSACleanup();
	system("PAUSE");
	return 0;
}

推荐答案

多线程:通常阻止 I / O 调用在单独的线程中处理。
Multithreading: usually blocking I/O calls are handled in separate threads.


创建一个继续坐在recv调用上的循环。仅当您从服务器收到退出呼叫时才终止循环。但是,您的代码不是很合理。通常的顺序是:

Create a loop that continues to sit on a recv call. Terminate the loop only when you receive a quit call from the server. However, your code is not very logical. The usual sequence would be:
connect
LOOP:
    send a message to the server
    receive a response
    if not "quit" THEN GOTO LOOP

close socket
terminate


这篇关于关于Winsock的一个问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆