クライアントからサーバーにオプションを送信したい。サーバーはいくつかの比較を行い、文字列をクライアントに送り返す必要があります。クライアントからデータを受信できますが、比較の瞬間にサーバーがクラッシュします(「エラー入力」で他のサーバーに到達し、接続を終了します)。誰かが私が間違っていることを教えてもらえますか?
不正なInputcloseエラー:不正なファイル記述子
プログラムはコード01で終了しました。
サーバ:
void
result(int sockfd)
{
ssize_t n;
char buf[MAXLINE];
int temp;
time_t ticks;
again:
while ((n =read(sockfd, buf, MAXLINE)> 0))
{
temp = rand() % 22;
if (buf=="A\n" || buf=="a\n")
{
snprintf(buf, sizeof(buf), "You option is number is -%i, time is %.24s\r\n", temp,ctime(&ticks));
Writen(sockfd, buf, n);
}
if (buf=="B\n" || buf=="f\")
{
snprintf(buf, sizeof(buf), "You option is number is -%i, time is %.24s\r\n", temp,ctime(&ticks));
Writen(sockfd, buf, n);
}
else
{
printf("Incorrect Input");
Close(sockfd);
}
}
if (n < 0 && errno == EINTR)
goto again;
else if (n < 0)
err_sys("read error");
}
int
main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t len;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
char recvline[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(5678);
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
printf("EDMTS is running on 129.128.4.80, listening on port 5678\n");
printf("\n");
printf("Waiting for incoming connections...Press Ctrl+C to end server\n");
for ( ; ; )
{
len = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &len);
/*Client connects to server*/
printf("\n");
printf("Connection from %s, port %d\n",
Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
ntohs(cliaddr.sin_port));
result(connfd);
Close(connfd);
printf("Conexion cerrada...Esperando siguiente cliente\n");
}
}
クライアント
void
get_temp(FILE *fp, int sock)
{
char sendline[MAXLINE], recvline[MAXLINE];
while (Fgets(sendline, MAXLINE, fp) != NULL) {
Writen(sock, sendline, strlen(sendline));
if (Readline(sock, recvline, MAXLINE) == 0)
err_quit("Server Terminated Prematurely");
Fputs(recvline, stdout);
}
}
int
main(int argc, char **argv)
{
int sockfd, n;
socklen_t len;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr, cliaddr;
char scale[2];
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]));
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[1]);
printf("Connect...\n");
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("Enter option A or B): ");
get_temp(stdin, sockfd);
exit(0);
}
デバッガーを実行して変数を見つけると、次のことがわかります。
ブレークポイント1、servertest.c:236での結果(sockfd = 7)236
printf( "Random es%i \ n"、temp); (gdb)p buf $ 1 = "A \ n"、'\ 0'、 "\ 203 \217��"、'\ 0'、"h\206��h\206��\204\210��� ���#���\ 000 \ 000 \000\000�\206������\020\207��#��� "、'\ 0'、"��������� ���\000\ 000 \ 000 \ 000 \ 000 \ 000 \ 000\000�\017��"、'\ 0'、" h\206��"、'\ 0'、" \ 001 \ 000 \ 000 \ 000 \ 000 \ 000 \ 000\000�\207��"、'\ 0'、"����\ t \ 000 \ 000 \ 000#���\030���\ 000 \ 000 \ 000 \000h\206��\003"、'\ 0'、" \ n \ 000 \ 000 \ 000g\206��"、'\ 0'、" "...(gdb)p temp $ 2 = 17
どうもありがとうございます