서버를 실행 한 후 두 개의 클라이언트 인스턴스를 실행합니다. 이제 클라이언트를 처음 실행하면 수신 된 데이터가 배열 [0]에 저장되지만 두 번째 클라이언트를 실행하면 array [0]의 값이 새로운 값으로 놀랍게 덮어 씁니다. 새 데이터는 덮어 쓰지 않고 배열 [1]에 저장됩니다. 어떤 실수를 저질렀습니까?배열 값이 예기치 않게 변경된 후 recv()
char * Array [100]; int ArrayCount = 0; 전역 변수입니다. RECV 후
data in Array[0] before recv : (null)
data in Array[0] after recv : (null)
data in Array[0] before recv : 1st Instance
data in Array[0] after recv : 2nd Instance
적 데이터가 "1 인스턴스"이어야 나 배열을 인쇄이기 때문에, [0]
void *server()
{
int listenfd = 0;
connfd = 0;
struct sockaddr_in serv_addr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(port));
if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))<0)
{
perror("bind");
exit(1);
}
listen(listenfd, 10);
while(1)
{
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
printf("data in Array[0] before recv : %s\n",Array[0]);
int ns;
char revdData[2000];
bzero(revdData,2000);
ns = recv(connfd,revdData,2000,0);
close(connfd);
printf("data in Array[0] after recv : %s\n",Array[0]);
Array[ArrayCount] = revdData;
ArrayCount = ArrayCount+1;
}
}
클라이언트 코드
void *client()
{
int soctype = SOCK_STREAM;
struct hostent *hp, *gethostbyname();
struct sockaddr_in servR;
struct servent *seR;
int tempSocket;
char *host = "localhost";
if ((tempSocket = socket(AF_INET, soctype, 0)) < 0)
{
perror("socket");
exit(1);
}
if ((hp = gethostbyname(host)) == NULL)
{
exit(1);
}
servR.sin_family = AF_INET;
memcpy(&servR.sin_addr, hp->h_addr, hp->h_length);
if (isdigit(*port))
{
servR.sin_port = htons(atoi(port));
}
else
{
if ((seR = getservbyname(port, (char *)NULL)) < (struct servent *) 0)
{
perror(port);
exit(1);
}
servR.sin_port = seR->s_port;
}
if (connect(tempSocket, (struct sockaddr *) &servR, sizeof(servR)) < 0)
{
perror("connect");
exit(1);
}
char input[100];
fgets(input,100,stdin);
int n;
n=send(tempSocket,input,100,0);
if (n < 0)
{
error("Send");
}
}
출력은 다음과 같다. revdData
이 server()
로 구분 된 범위가 로컬 배열이기 때문에
Array[ArrayCount] = revdData;
이 잘못된 코드 :
'struct hostent * hp, * gethostbyname();'이 잘못되었습니다. 대신, 적절한 헤더 파일을'#include '한다. 아니면 더 나은,'getaddrinfo()'와'getnameinfo()'에 의해'getservbyname()'과'gethostbyname()'을 대체하십시오. – glglgl