/******************************************************
>File Name: tcpServer.c
>Author: liu
>Mail: 2557363950@qq.com
>Created Time: 2017年08月23日 星期三 11时57分03秒
******************************************************/
#include "all.h"
int getMax(int sockfd,int *connfds,int size)
{
int max=sockfd;
int i=0;
for(;i<size;i++)
{
if(connfds[i]!=-1)
{
max=max>connfds[i]?max:connfds[i];
}
}
return max;
}
void handleClientConnect(int sockfd,int *connfds,int size)
{
int connfd=accept(sockfd,NULL,NULL) ;
if(connfd<-1)
{
return ;
}
int i=0;
for(;i<size;i++)
{
if(connfds[i]==-1)
{
connfds[i]=connfd;
return ;
}
}
}
//tcpServer
int main()
{
//1.创建套接字
/*
参数
family:AF_INET(网络),AF_UNIX(本地)
type:SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
protocal:0
*/
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd <0)
{
perror("socket failed");
return 0;
}
int on = 1;
//设置端口重用,在绑定之前设置
setsockopt (sockfd,SOL_SOCKET,SO_REUSEPORT,&on,sizeof(int));
//2.绑定IP和端口
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(5555);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr))<0 )
{
perror("bind failed");
return 0;
}
//3.设置监听
if(listen(sockfd, 128)<0)
{
perror("listen failed");
return 0;
}
int connfds[20];
int i=0;
for(;i<20;i++)
{
connfds[i]=-1;
}
fd_set readSet;
while(1)
{
FD_ZERO(&readSet);
FD_SET(sockfd,&readSet);
i=0;
for(;i<20;i++)
{
if(connfds[i]!=-1)
{
FD_SET(connfds[i],&readSet);
}
}
int max=getMax(sockfd,connfds,20);
select(max+1,&readSet,NULL,NULL,NULL);
if(FD_ISSET(sockfd,&readSet))
{//来到这里说明有客户段
handleClientConnect(sockfd,connfds,20);
}
int i=0;
for(;i<20;i++)
{
if(connfds[i]!=-1)
{
if(FD_ISSET(connfds[i],&readSet))
{
char buf[100];
int ret=read(connfds[i],buf,sizeof(buf));
if(ret==0)
{
close(connfds[i]);
connfds[i]=-1;
printf("client%d off\n",connfds[i]);
continue;
}
printf("client%d say:%s\n",connfds[i],buf);
}
}
}
}
}
#if 0
//4接受连接
int connfd = accept(sockfd,NULL,NULL);
if(connfd < 0)
{
perror("connect failed");
return 0;
}
//接受客户端发来的数据
char buf[100] = {'\0'};
//开进程,父进程做接收,子进程做读取;
pid_t pid = fork();
if(pid > 0)
{
//父
while(1)
{
scanf("%s",buf);
write(connfd,buf,sizeof(buf));
}
}
else if(pid == 0)
{
//子
while(1)
{
//read是一个阻塞函数,没有数据可读会等待socket管道里面出现的数据;
int ret = read(connfd,buf,sizeof(buf));
if(ret == 0)
{
//来到这说明客户端断连接
printf("客户端断开连接...\n");
close(connfd);
//杀死父进程
kill(getppid(),SIGKILL);
return 0;
}
printf("client say:%s\n",buf);
}
}
}
#endif
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
tcp.tar.gz (9个子文件)
tcp
client 9KB
server 13KB
1.cpp 94B
selectClient.c 874B
all.h 2KB
selectserver.c 3KB
a.out 9KB
tcpClient.c 1KB
tcpServer.c 2KB
共 9 条
- 1
资源评论
小波思基
- 粉丝: 74
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功