利用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();
}
#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();
}
相关文章推荐
- 利用WSAEventSelect进行网络通信
- Android中利用httpclient进行网络通信的方法(以用户登录为例说明)
- ios中利用BSDSocket进行网络通信(客户端篇)
- 【Linux网络编程实例】实例二:利用TCP协议进行客户端与服务器通信
- Android中利用httpclient进行网络通信的方法(以用户登录为例说明)
- Android 利用httpclient进行网络通信,实现用户登录的方法
- Android利用Fiddler进行网络数据抓包
- Java中利用Socket进行通信
- Android利用Fiddler进行网络数据抓包
- Android利用Json来进行网络数据传输
- (2017.4.4更新) 利用神经网络进行字符型图片验证码识别
- Android如何进行网络通信(与web交互)
- Android 使用 HttpClient 进行网络通信,包括Get方式和Post方式
- 利用Intent进行Activity之间的通信(1)
- 网络安全系列连载(5)利用数字证书进行代码签名
- linux中select网络通信
- Android网络开发中如何使用JSON进行网络通信---Android JSON数据通讯方法解析
- SPRING整合JMS进行网络通信
- 利用MFC的Csocket类实现网络通信
- Windows server 2003下实战利用MRTG进行网络监控