2015-01-07 2 views
0

TCP 소켓을 사용하여 서버와 클라이언트 간의 연결을 설정하는 코드를 작성했습니다. 클라이언트 측의 연결을 끊는 데 문제가 있습니다. 나는 현재 클라이언트가 닫더라도 다음 클라이언트를 기다리는 동안 서버 측이 계속해서 실행되기를 원한다. 클라이언트 측에 대한 내 코드 : 서버 측지속적으로 서버 소켓을 실행 중

int main(int argc, char *argv[]) 
{ 
int sockfd = 0, n = 0,c; 
char recvBuff[1024]; 
struct sockaddr_in serv_addr; 
if(argc != 2) 
{ 
    printf("\n Usage: %s <ip of server> \n",argv[0]); 
    return 1; 
} 

memset(recvBuff, '0',sizeof(recvBuff)); 
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
{ 
    printf("\n Error : Could not create socket \n"); 
    return 1; 
} 

memset(&serv_addr, '0', sizeof(serv_addr)); 

serv_addr.sin_family = AF_INET; 
serv_addr.sin_port = htons(6006); 

if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0) 
{ 
    printf("\n inet_pton error occured\n"); 
    return 1; 
} 

if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
{ 
    printf("\n Error : Connect Failed \n"); 
    return 1; 
} 
while(1) 
{ 
printf("\n 1 to read \n"); 
printf("\n 2 to disconnect \n");   
printf("\n 3 to exit \n"); 
scanf("%d",&c); 
    switch(c) 
    { 
    case 1: 
     printf("\n Inside case 1 \n"); 
     if((n=send(sockfd,&c,sizeof(c),0))>0) 
      printf("\n Sent \n"); 
     n = recv(sockfd, recvBuff, sizeof(recvBuff)-1,0); 
     recvBuff[n] = 0; 
      if(fputs(recvBuff, stdout) == EOF) 
      { 
        printf("\n Error : Fputs error\n"); 
      } 
     break; 
    case 2: 
     close(sockfd);//to close only client not server 
    case 3: 
     close(sockfd); 
     exit(1); 



    } 
} 

} 

코드 : 서버 (다음 클라이언트 연결을 위해 서버가 대기를) 실행하는 동안

int main(int argc, char *argv[]) 
{ 
int listenfd = 0, connfd = 0,info,n; 
struct sockaddr_in serv_addr; 

char sendBuff[1025]; 
time_t ticks; 
listenfd = socket(AF_INET, SOCK_STREAM, 0); 
memset(&serv_addr, '0', sizeof(serv_addr)); 
memset(sendBuff, '0', sizeof(sendBuff)); 

serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
serv_addr.sin_port = htons(6006); 

bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

listen(listenfd, 10); 

while(1) 
{ 
    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 
printf("\n Accepted \n"); 
while(1) 
{ 
    printf("\n Inside while \n"); 
    if((n=recv(connfd,&info,sizeof(info),0))>0) 
    printf("\n received \n"); 
    switch(info) 
    { 
    case 1: 
      ticks = time(NULL); 
      snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks)); 
      send(connfd, sendBuff, strlen(sendBuff),0); 
     break; 
    } 
} 
close(connfd); 


} 

} 

나에게 형 클라이언트를 분리하는 솔루션을 제공합니다. 케이스 2에서 리턴 0을 사용하더라도 작동하지 않습니다. 친절

+0

오류가 있습니까? 자습서를 보셨습니까? – EJP

+1

서버를 구현하기 위해'select' API를 사용하는 예제를 조사 할 것을 촉구합니다. 그리고 거기에있는 동안 소켓 API 호출에 의해 반환 된 오류가 발생했는지 확인하십시오. –

+0

http://stackoverflow.com/questions/27812390/running-server-socket-infinitely의 가능한 후속 조치. – user35443

답변

0
else if(n == 0) 
{ 
    printf("client disconnected\n"); 
    close(connfd); 
    break; 
} 

if((n=recv(connfd,&info,sizeof(info),0))>0) 
    printf("\n received \n"); 

분리하려고 클라이언트, 당신은을 닫습니다 일부 API를 보내야 할 때 문제가 옆에있는 서버 프로그램에서 위의 코드를 추가하여 사전에 찾아 와요 고마워요 도움이 클라이언트 연결.

클라이언트가 비정상적으로 연결이 끊어진 경우 위의 행은 해당 클라이언트를 자동으로 닫는 데 사용됩니다.

그런 다음 경고 메시지는 snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));입니다.

관련 문제