您的位置:首页 > 理论基础 > 计算机网络

利用select进行网络通信

2012-04-17 15:56 337 查看
    服务器端代码

   #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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息