클라이언트에게 메시지를 보내야하고 클라이언트가 옵션으로 응답해야합니다. 나는 클라이언트와 서버가 연결될 때까지 얻지 만, 두 프로그램 모두는 "Segmentation Fault"로 끝납니다. 누구든지이 오류의 의미를 압니까? 누군가가 클라이언트와 서버가 상호 작용할 수있는 코드를 작성하는 방법에 대한 아이디어를 줄 수 있습니까? 클라이언트가 선택한 옵션을받은 후 서버는이를 분석하고 클라이언트에 결과를 다시 보내야합니다.서버에서 클라이언트로 메시지를 보내려고하는 세그먼트 오류
내 코드는 다음과 같습니다
서버
int
main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t len;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
time_t ticks;
char message[MAXLINE]="This is the server";
char temp_scale[2];
char recvdata[MAXLINE + 1];
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);/*----------------------------------------------------*/
servaddr.sin_port = htons(5555);
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
for (; ;)
{
len = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &len);
printf("Connection from %s, port %d\n",
Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
ntohs(cliaddr.sin_port));
snprintf(message, sizeof(message), "%s\r\n");
Writen(connfd, message, strlen(message));
while ((n = read(connfd, recvdata, MAXLINE)) > 0)
{
recvdata[n] = 0; /* null terminate*/
if (fputs(recvdata, stdout) == EOF)
err_sys("fputs error");
}
if (n < 0)
err_sys("read error");
Close(connfd);
}
}
클라이언트
int
main(int argc, char **argv)
{
int sockfd, rd;
socklen_t len;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr, cliaddr;
char scale[2];
/*if (argc != 2)
err_quit("usage: a.out <IPaddress>");*/
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2])); /*port passed through command line*/
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) /*The client translates the server address, passed on the command line*/
err_quit("inet_pton error for %s", argv[1]);
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
err_sys("connect error");
len = sizeof(cliaddr);
Getsockname(sockfd, (SA *) &cliaddr, &len);
printf("Local Address is: %s\n",
Sock_ntop((SA *) &cliaddr, sizeof(cliaddr)));
printf("Iniciando read...\n");
while ((rd = read(sockfd, recvline, MAXLINE)) > 0)
{
recvline[rd] = 0; /* null terminate*/
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (rd < 0)
err_sys("read error");
printf("Enter option 'A' or 'B'");
send_scale(sockfd);
exit(0);
}
감사
세그먼트 오류는 금지 된 메모리에 액세스하고 있음을 나타냅니다. 즉, 유효하지 않은 포인터 또는 포인터 또는 어레이 범위를 벗어난 액세스와 관련된 버그가 있습니다. – Lundin
일부 버퍼의 길이가 MAXLINE이지만 일부 버퍼가 MAXLINE + 1 인 이유는 무엇입니까? 코드를 이해하지 못하면 버그와 같은 냄새가 난다. – Lundin
고맙습니다. 문제를 해결하는 방법을 알 수 있습니까? 클라이언트와 서버에서 같은 기능을 사용합니다. 문제가 있습니까? – netfreak