나는 클라이언트 서버 응용 프로그램을 작성 중이며 여러 클라이언트 소켓과 stdin 사이의 폴링을 사용하여 명령을 삽입 할 수 있습니다 (예 : stop 서버). 코드를 쉽게하기 위해C - 소켓과 표준 사이의 멀티 플렉스를 사용하여 서버 - 서버
struct pollfd pfd[NSERVER]; //defined as 10
pfd[0].fd = fileno(stdin);
pfd[0].events = POLLIN;
pfd[1].fd = socktfd; //server bind, listen socket
pfd[1].events = POLLIN;
struct sockaddr_storage remoteaddr; // client address
socklen_t addrlen;
char remoteIP[INET6_ADDRSTRLEN];
addrlen = sizeof remoteaddr;
char buf[1024]; // buffer
int pos=2;
while(poll(pfd,1,0) >= 0)
{
if(pfd[0].revents & POLLIN) { //stdin
//process input and perform command
}
if(pfd[1].revents & POLLIN) {
/* new connection */
int connsockfd = accept(socktfd, (struct sockaddr *)&remoteaddr,&addrlen);
pfd[pos].fd=connsockfd;
}
int i=2;
//Loop through the fd in pfd for events
while (i<=NSERVER)
{
if (pfd[i].revents & POLLIN) {
int c=recv(pfd[i].fd, buf, sizeof buf, 0);
if(c<=0) {
if (c==0)
{
/* Client closed socket */
close(pfd[i].fd);
}}
else
{//Client sent some data
c=send(pfd[i].fd,sbuff,z,0);
if (c<=0)
{
Error;
}
free(sbuff);
}
}
i++;
}
}
내가 RECV 내부의 코드를 제거하고 전송했습니다 그러나 나는 그것이 내가 그것을 예상대로 작동하지 않는 것, 내 코드의 구조 (이하 "논리") 올바른 생각 읽다. 동작에 실패 (연결이 끊어 지거나 연결을 허용하지 않음 또는 표준 입력에서 반응 함).
참고 : select over poll을 사용하는 것이 좋으므로 선택하지 않는 것이 좋습니다 :-).
미리 도움을 청하십시오.
소켓이 차단되었거나 차단되지 않았습니까? 그것은 어디서 멈 춥니 까? – ninjalj
비 블로킹이며 처음부터 중단됩니다. stdin에서 입력을 입력 할 수 있지만 처리되지 않았습니다. 소켓과 동일 –
_exactly_는 멈 춥니 다? 'strace' 또는 이와 동등한 것에서 실행하십시오. – ninjalj