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을 사용하더라도 작동하지 않습니다. 친절
오류가 있습니까? 자습서를 보셨습니까? – EJP
서버를 구현하기 위해'select' API를 사용하는 예제를 조사 할 것을 촉구합니다. 그리고 거기에있는 동안 소켓 API 호출에 의해 반환 된 오류가 발생했는지 확인하십시오. –
http://stackoverflow.com/questions/27812390/running-server-socket-infinitely의 가능한 후속 조치. – user35443