select 함수
**int select(int maxfdp,fd_set readfds,fd_set writefds,fd_set errorfds,struct timevaltimeout); 헤더 파일: #include
maxfdp는 정수치로 집합 중의 모든 파일 설명자의 범위를 가리킨다. 즉, 모든 파일 설명자의 최대 값에 1을 더한다.readfds는 fd 를 가리킨다구조의 지침, 이 집합에는 파일 묘사자가 포함되어야 한다. 우리는 이 파일 묘사자의 읽기 변화를 감시해야 한다. 즉, 우리는 이 파일에서 데이터를 읽을 수 있는지에 관심을 가진다. 만약에 이 집합에 파일을 읽을 수 있다면 select는 0보다 큰 값을 되돌려 파일을 읽을 수 있음을 나타낸다. 읽을 수 있는 파일이 없으면 타임아웃 파라미터에 따라 시간 초과 여부를 판단한다. 타임아웃의 시간을 초과하면select는 0을 되돌려줍니다. 오류가 발생하면 마이너스를 되돌려줍니다.파일의 읽기 변경 사항에 관심이 없음을 나타내기 위해 NULL 값을 전달할 수 있습니다.writefds는 fd 를 가리킨다구조의 지침, 이 집합에는 파일 묘사자가 포함되어야 한다. 우리는 이 파일 묘사자의 쓰기 변화를 감시해야 한다. 즉, 우리는 이 파일에 데이터를 쓸 수 있는지에 관심을 가진다. 만약에 이 집합에 파일을 쓸 수 있다면 select는 0보다 큰 값을 되돌려주고 쓸 수 있는 파일이 있음을 나타낸다. 쓸 수 있는 파일이 없으면 타임아웃에 따라 시간 초과 여부를 판단한다. 타임아웃의 시간을 초과하면select는 0을 되돌려줍니다. 오류가 발생하면 마이너스를 되돌려줍니다.NULL 값을 전송하여 파일의 쓰기 변경에 관심이 없음을 나타낼 수 있습니다.errorfds는 파일의 오류 이상을 감시하기 위해 위의 두 인자와 같은 의도입니다.timeout은 select의 시간 초과입니다. 이 매개 변수는 매우 중요합니다. 이것은 select를 세 가지 상태에 있게 할 수 있습니다.첫째: 만약에 NULL을 형참으로 전송하면 전송되지 않는 시간 구조는select를 막힌 상태에 놓고 감시 파일 묘사자 집합 중의 어떤 파일 묘사자가 변화할 때까지 기다려야 한다.둘째, 시간 값을 0초 0밀리초로 설정하면 순수한 비저항 함수로 변한다. 파일 설명자에 변화가 있든 없든 즉시 다시 실행하고 파일은 변화가 없으면 0으로 돌아가고 변화가 있으면 하나의 값을 되돌린다.셋째:timeout의 값이 0보다 크다. 이것은 기다리는 시간 초과 시간이다. 즉,select는timeout 시간 내에 막히고 시간 초과 시간 안에 이벤트가 오면 되돌아온다. 그렇지 않으면 시간 초과 후에 어쨌든 반드시 되돌아온다. 되돌아오는 값은 상기와 같다.
반환값:음값:select 오류;양수 값: 일부 파일의 읽기 및 쓰기 오류0: 대기 시간이 초과되어 읽기 및 쓰기 오류가 있는 파일이 없습니다.
텍스트 링크:https://blog.csdn.net/mayue_web/article/details/89021273
서버
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SIZE 1024
int main()
{
int ret;
int fd[SIZE] = {0};
// socket( )
int sockfd = socket(PF_INET, SOCK_STREAM, 0);
//IPV4 (TCP) ( 0)
if (-1 == sockfd)
{
perror("socket");
exit(1);
}
int opt = 1;
setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// ( )
struct sockaddr_in server_addr; //
struct sockaddr_in client_addr; //
memset(&server_addr, 0, sizeof(server_addr)); //
server_addr.sin_family = PF_INET; // socket
server_addr.sin_port = 7000;
// ( 1024 65536) ( )
// , man inet_addr
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
//ip ifconfig> 127.0.0.1 ip( )
//
ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) ;
if (-1 == ret)
{
perror("bind");
exit(1);
}
//
ret = listen(sockfd, 10);
if (-1 == ret)
{
perror("listen");
exit(1);
}
fd_set readfd, tmpfd; //
FD_ZERO(&readfd); //
FD_SET(sockfd, &readfd); // sockfd
int maxfd = sockfd;
int length = sizeof(struct sockaddr_in);
int i;
char buf[128] = {0};
while (1)
{
tmpfd = readfd; //select
ret = select(maxfd + 1, &tmpfd, NULL, NULL, NULL);
// NULL
if (-1 == ret)
{
perror("select");
exit(1);
}
if (FD_ISSET(sockfd, &tmpfd)) //
{
printf(" ...
");
for (i = 0; i < SIZE; i++)
{
if (0 == fd[i])
{
break;
}
}
fd[i] = accept(sockfd, (struct sockaddr *)&client_addr, &length) ;
if (-1 == fd[i])
{
perror("accept");
exit(1);
}
printf(" %d !
", fd[i]);
if (fd[i] > maxfd)
{
maxfd = fd[i];
}
FD_SET(fd[i], &readfd);
}
else //
{
for (i = 0; i < SIZE; i++)
{
if (FD_ISSET(fd[i], &tmpfd)) //
{
ret = recv(fd[i], buf, sizeof(buf), 0);
if (-1 == ret)
{
perror("recv");
exit(1);
}
if (0 == ret)
{
printf(" %d
", fd[i]);
close(fd[i]); // TCP
FD_CLR(fd[i], &readfd); //
fd[i] = 0;
break;
}
if (!strcmp(buf, "bye"))
{
printf(" %d !
", fd[i]);
close(fd[i]); // TCP
FD_CLR(fd[i], &readfd); //
fd[i] = 0;
break;
}
printf(" %d %s
", fd[i], buf);
memset(buf, 0, sizeof(buf));
break;
}
}
}
}
return 0;
}
클라이언트
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int sockfd = socket(PF_INET, SOCK_STREAM, 0)
if (-1 == sockfd)
{
perror("socket");
exit(1);
}
//
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
//
server_addr.sin_family = PF_INET;
server_addr.sin_port = 7000;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (-1 == ret)
{
perror("connect");
exit(1);
}
char buf[128] = {0};
while (1)
{
scanf("%s", buf);
ret = send(sockfd, buf, strlen(buf), 0); //write
if (-1 == ret)
{
perror("send");
exit(1);
}
if (!strcmp(buf, "bye"))
{
break;
}
}
close(sockfd); // TCP
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.