telnetがテキストデータを送る際の改行コードは、windowsだろうが、Mac、Linuxだろうが、
常にNVT ASCIIの改行コード(CR+LF:0x0D0A)です。
これは、異機種間の改行コードを吸収するためで、受信側telnetサーバは、自分の環境にあった
改行コードに変換します。
ここでは、Mac OS X telnetクライアントより送信されるテキストに、NVT ASCII改行コード(CR+LF:0x0D0A)が
付与されることを、パケットキャプチャwiresharkを使って確認してみます。
ちなみに、Mac os x Lionの改行コードは、LF:0x0Aです。
サーバ側プログラム:
Ubuntu エコーサーバ (192.168.11.6)
クライアント側プログラム:
Mac OS X Lion telnetクライアント (192.168.11.11)
クライアントターミナルより、サーバ側エコーサーバへコネクション要求
コネクション確立後、"this is a the end-of-line testing."とキーイン。
サーバからクライアント側へ"this is a the end-of-line testing."がエコー。
wiresharkでのダンプ。
Mac側で、wiresharkでパケットをダンプ。
No.1353〜1355が3wayハンドシェーク、No.1778〜1781がデータの送受信と制御信号、No1912〜1914がクローズシーケンス
No.1778のパケットダンプ(Mac telnetクライアントパケット)
0060で、NVT ASCIIの改行コード0x0d0aが付与されているのが分かります。
Ubuntu echoサーバ
#include "unp.h"
#include "unistd.h"
int
main(int argc, char **argv)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
void sig_chld(int);
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(9877);
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
Signal(SIGCHLD, sig_chld);
for ( ; ; ) {
clilen = sizeof(cliaddr);
if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {
if (errno == EINTR)
continue; /* back to for() */
else
err_sys("accept error");
}
if ( (childpid = Fork()) == 0) { /* child process */
Close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
Close(connfd);
exit(0);
}
Close(connfd); /* parent closes connected socket }
}