#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 10086 //定义端口号为多少
void *dosth(void *arg); //线程调用函数
int main(void)
{
//先创建socket连接,规定好设备与设备之间的通讯协议为 IPV4 TCP 协议
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror("socket error");
exit(-1);
}
//更改sockfd的属性,允许地址重复:防止报“地址重复”错误
int on = 1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
//绑定:设置好本地的通讯协议是什么,端口号和IP地址分别为多少
struct sockaddr_in myself;
myself.sin_family = AF_INET; //设置本地通讯协议为 IPV4 TCP 协议
myself.sin_port = htons(PORT);
myself.sin_addr.s_addr = htonl(INADDR_ANY); //设置本地的IP地址
if(bind(sockfd,(struct sockaddr *)&myself,sizeof(myself))){ //绑定本地属性,使用bind()函数,来让上面设置好的本地属性生效
perror("bind error");
exit(-1);
}
//监听:将主动连接变成被动连接,即:设置为只能等待被其他设备连接,而不能主动的去连接其他设备,这就是服务器端。
if(listen(sockfd,30)){ // 30表示最大只允许连接30个设备
perror("listen error");
exit(-1);
}
//客户端的IP地址与PORT信息,用client变量来存储
struct sockaddr_in client;
int len = sizeof(client);
int fd;
int m=20;
pthread_t thread;
while(1){
//等待客户连接
fd = accept(sockfd,(struct sockaddr *)&client,&len);
if(fd<0){
if(!(m--)){ //m = 20,即:某个客户被允许连接失败次数为20次,如果20次还没有连接成功,则打印"accept error"
perror("accept error");
}
}else{
m=20;
if(pthread_create(&thread,NULL,dosth,&fd)){
perror("pthread_create error");
}
//将线程设置为分离属性,当线程结束后,会自动自己释放资源空间
pthread_detach(thread);
}
}
return 0;
}
//线程函数
void *dosth(void *arg)
{
int fd = *(int *)arg;
char buf[20];
char buff[10]="牛逼";
//接受数据,转发数据
int ret;
while(1){
bzero(buf,sizeof(buf));
ret = recv(fd,buf,sizeof(buf),0); //接收客户发来的信息,将信息赋值给buf数组
if(ret<=0){
close(fd);
pthread_exit(NULL);
}else{
printf("%sn",buf); //打印buf数组中的信息
send(fd,buff,strlen(buff),0);
}
}
}



