进程间通信 SOCKET Server

#include <stdlib.h>
#include <dirent.h>
#include <time.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <error.h>


int server()
{
		int iSockfd = socket(PF_INET,SOCK_STREAM,0);  /*1. 准备socket*/
		if(iSockfd == -1)
		{               
		   	perror("socket:");
		    return 0;
		}
		
		/*2. 准备地址*/
		struct sockaddr_in addr;
		addr.sin_family = PF_INET;
		
		addr.sin_port = htons(17777);
		inet_aton("127.0.0.1",&addr.sin_addr);
		
		int flag=1,len=sizeof(int);
		
		//解决端口TIME_WAIT状态,无法连接
		if( setsockopt(iSockfd, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1)
		{ 
		    return -1;
		}
		
		int iRes = bind(iSockfd, (struct sockaddr*)&addr, sizeof(addr));  /*3.绑定*/
		if(iRes == -1)
		{         
				perror("Bind 失败:");
		    return -1;
		}
		
		iRes = listen(iSockfd, 100);    /*4.监听*/
		if(iRes == -1)
		{
		    perror("监听失败:");
		    return -1;
		}
		
		int infds;
		while(1)
		{
		    /*5.等待客户端连接*/
		    struct sockaddr_in fromaddr;
		    socklen_t len = sizeof(fromaddr);
		
		    /*6.和客户端通信*/
		    /*6.1接收客户端数据*/
		    char buf[100] = {0};
		
		    struct timeval timeout;
		    timeout.tv_sec = 2;
		    timeout.tv_usec = 0;
		    fd_set Readyfd;
		    FD_ZERO(&Readyfd);
		    FD_SET(iSockfd, &Readyfd); 
		    
		   infds = select(iSockfd+1, &Readyfd, NULL, NULL, &timeout);
		    
		   if(infds>0)
		   {
		        if(FD_ISSET(iSockfd, &Readyfd))
		        {
		            int fd = accept(iSockfd, (struct sockaddr*)&fromaddr,(socklen_t *)&len);
		            if(-1 == fd)
		            {
		                /*告警信息  不影响下一个资源申请 所以一直是监听状态*/
		             
		                continue;
		            }
		            
		            if(read(fd, buf, 100)<=0)
		            {
		            		printf("-----Error\n");
		                close(fd);
		                continue;
		            }
		            
		            else
		            {
		            		printf("------buf=%s\n",buf);
		            		//sleep(5);//write(fd,(char *) "Server send date", 100);
		            		sleep(5);
		            		if(write(fd,(char *) "Server send date", 100)<=0) 
                    {
                        close(fd);
                        continue;
                    }               
                 
		            }
		        }
		   }
		   
		   else if(infds < 0)
		   {
		      	perror("错误");
		        break;
		   }
		   
		  else 
		  {
					printf("超时处理\n");
					//write(iSockfd+1,(char *) "---Server--- Send", 100);
		      continue;     
		  }
		  
		}
		    
		close(iSockfd);


		return 0;
}


int main()
{
		server();
		return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值