네트워크를 통해 통신하고 간단한 클라이언트 서버 통신을 구현하는 간단한 클라이언트와 서버를 구현하는 소켓 프로그래밍. 클라이언트는 사전 정의 된 포트에서 서버와의 세션을 연 다음 텍스트 메시지 행을 제공합니다.TCP 소켓 프로그래밍
서버는 표준 출력으로 텍스트 메시지를 출력하고 더 많은 문자 메시지를 수신하기 위해 계속 실행합니다.
클라이언트가 종료 옵션을 선택하여 세션을 닫으면 서버에 대한 연결이 정상적으로 종료되어야합니다.
서버가 컨트롤 C를 눌러 종료되면 서버는 열려있는 소켓도 정상적으로 해제해야합니다.
나는이 프로그램을 만들었지 만 문자열을 입력하고 클라이언트 측에서 Enter 키를 누르면 서버에 나타나지 않지만 두 번째 입력시 첫 번째 입력이 나타나고 두 번째 입력이 보류 중입니다.
두 번째는 세 번째 입력이 완료되면 ...
내가이 문제에 대한 해결책을 얻을 수 나타납니다?
//Server.c
int main()
{
int listenfd = 0;
int confd=0;
struct sockaddr_in sa;
char msg[1025];
char c[1];
int i;
listenfd = socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0)
{
perror("Socket");
return 1;
}
sa.sin_family = AF_INET;
sa.sin_port = htons(1234);
sa.sin_addr.s_addr = htonl(INADDR_ANY);
while((bind(listenfd,(struct sockaddr*)&sa,sizeof(sa))<0)){return 1;}
printf("\nBind Successfull");
listen(listenfd,10);
while(1){
confd=accept(listenfd,(struct sockaddr*)NULL,NULL);
printf("\nConnected");
memset(msg,0x0,10);
do{
read(confd,c,1);
if(strcmp(c,"n")!=0)
{
read(confd,msg,10);
printf("\n%s",msg);
memset(msg,0x0,10);
}
else{
confd=accept(listenfd,(struct sockaddr *)NULL,NULL);
printf("\nWaiting..");
//close(confd);
}
// write(confd,msg,10);
//}
//msg[rc]='\0'
}while(1);
close(confd);
}
}
//Client.c
int main()
{
int sock1= 0;
FILE *serv;
struct sockaddr_in server,clin;
char msg[1024],c[1];
server.sin_family = AF_INET;
server.sin_port = htons(1234);
if(inet_pton(AF_INET,"192.168.125.7",&server.sin_addr)<0)
{
perror("inet_pton");
return 1;
}
if((sock1 = socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}
if(connect(sock1,(struct sockaddr*)&server,sizeof(server))<0)
{
perror("Connect");
return 1;
}
//printf("\nEnter 'y' to exit.");
while(1){
// memset(&msg, '0', sizeof(msg));
printf("\nDo you want to continue(y/n):");
scanf(" %[^\n]",c);
if(strcmp(c,"y")==0){
printf("\nEnter String:");
scanf("%c",&c);
scanf(" %[^\n]",msg);
printf("\nSending String to server..");
//scanf("%c",&c);
write(sock1,c,1);
write(sock1,msg,10);
}
if(strcmp(c,"n")==0)
{
write(sock1,c,10);
exit(1);
}
}
close(sock1);
printf("\n");
}
맨 페이지에서 read()/write()를 자세히 읽고 소켓에 대해 적어도 두 함수가 읽은 바이트만큼 읽거나 쓰지는 않는다는 사실을 배웠다. 모든 데이터 나 터미네이터가 읽기/쓰기 될 때까지 카운트를 반복하는 것은 좋은 생각입니다. 꼭 필요한 것은 아닙니다. – alk