进程间通信 SOCKET Server

来源:互联网 发布:便宜质量好的淘宝店 编辑:程序博客网 时间:2024/05/21 05:21
#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;}

0 0
原创粉丝点击