利用select进行网络通信

    服务器端代码

   

#define FD_SETSIZE 500
#include<winsock2.h>
#pragma comment(lib,"WS2_32")
#include<stdio.h>
void main()
{
	printf("............服务器.....................\n");
	WORD wVersionRequested =MAKEWORD(2,2);
	WSADATA wsaData;
	if(WSAStartup(wVersionRequested,&wsaData)!=0)
	{
		printf("WSAStartup Failed\n");
		printf("WSAStartup error=%d\n",WSAGetLastError());
	}
	else
	{
		printf("加载成功\n");
		printf("版本号:%x\n",wsaData.wVersion);
		printf("最高版本号:%x\n",wsaData.wHighVersion);
		printf("库说明字符串:%s\n",&wsaData.szDescription[0]);
		printf("配置说明字符串:%s\n",&wsaData.szSystemStatus[0]);
	}

	SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(s==INVALID_SOCKET)
	{
		printf("Failed socket\n");
		printf("socket Error=%d\n",WSAGetLastError());
	}
	else
		printf("套接口成功建立,套接口号:[%u]\n",s);

	u_long ul=0;
	ioctlsocket(s,FIONBIO,(u_long*)&ul);

	sockaddr_in Sadd;
	Sadd.sin_family=AF_INET;
	Sadd.sin_port=htons(5555);
	Sadd.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

    if(bind(s,(sockaddr*)&Sadd,sizeof(Sadd))==SOCKET_ERROR)
	{
		printf("Failed bind\n");
		printf("bind Error=%d\n",WSAGetLastError());
	}
	else
	{
		printf("绑定成功\n");
		printf("本地ip地址:[%s],本地端口号:[%u]\n",inet_ntoa(Sadd.sin_addr),ntohs(Sadd.sin_port));
	}

	if(listen(s,2)==SOCKET_ERROR)
	{
		printf("Failed listen\n");
		printf("listen Error=%d\n",WSAGetLastError());
	}
	else
		printf("进入监听状态\n");

	int x=1;
	timeval tv;
	tv.tv_sec=20;
	tv.tv_usec=0;
	fd_set socket_jh1;
	FD_ZERO(&socket_jh1);
	FD_SET(s,&socket_jh1);
	fd_set socket_jh2;
	FD_ZERO(&socket_jh2);

	while(true)
	{
		socket_jh2=socket_jh1;
		int sock_sum=select(0,&socket_jh2,NULL,NULL,&tv);

		if(sock_sum>0)
		{
			for(int i=0;i<(int)socket_jh2.fd_count;i++)
			{
				if(socket_jh2.fd_array[i]==s)
				{
					if(socket_jh1.fd_count<FD_SETSIZE)
					{
						sockaddr_in Cadd;
						int Cadd_len=sizeof(Cadd);
						SOCKET sNew=accept(s,(sockaddr*)&Cadd,&Cadd_len);
						FD_SET(sNew,&socket_jh1);
						printf("接受一个客户端连接,对方地址:【%s】,端口号:【%d】\n",inet_ntoa(Cadd.sin_addr),ntohs(Cadd.sin_port));
						printf("分配给该客户端的套接口为:%d\n\n",sNew);
					}
					else
					{
						printf("连接数量太多\n");
						continue;
					}
				}
				else
				{
					char cbuf[256];
					memset(cbuf,0,256);
					int cRecv;
					cRecv=recv(socket_jh2.fd_array[i],cbuf,256,0);
					if(cRecv==SOCKET_ERROR)
					{
						printf("可能客户端%d非法关闭!",socket_jh2.fd_array[i]);
						printf("或者调用recv() Failed,Error=【%d】\n",WSAGetLastError());
						closesocket(socket_jh2.fd_array[i]);
						FD_CLR(socket_jh2.fd_array[i],&socket_jh1);
					}
					else if(cRecv>0)
					{
						printf("接受到来自【%d】的数据:%s\n",socket_jh2.fd_array[i],cbuf);
						int isend;
						char sbuf[]="Hello client!I am server";
						isend=send(socket_jh2.fd_array[i],sbuf,sizeof(sbuf),0);
						if(isend==SOCKET_ERROR)
						{
							printf("send() Failed,Error=【%d】\n",WSAGetLastError());
							break;
						}
						else if(isend<=0)
						{
							printf("消息发送失败!\n");
							break;
						}
						else
							printf("给客户端【%d】信息已发送,信息长度%d字节\n\n",socket_jh2.fd_array[i],isend);
					}
					else
					{
						printf("客户端【%d】不再发送数据,正常关闭连接,为客户端连接创建的套接口将关闭!\n",socket_jh2.fd_array[i]);
						closesocket(socket_jh2.fd_array[i]);
						FD_CLR(socket_jh2.fd_array[i],&socket_jh1);
					}
				}
			}
		}
		else if(sock_sum==0)
		{
			printf("第【%d】次超时\n",x);
			if(x<3)
			{
				x++;
				continue;
			}
			else
			{
				printf("超时等待限制,退出程序\n");
				break;
			}
		}
		else
		{
			printf("select() Failed,Error=【%d】\n",WSAGetLastError());
			break;
		}
	}
	closesocket(s);
	printf("退出\n");
	WSACleanup();
}

你可能感兴趣的:(tcp,网络,socket,Stream,服务器,null)