UDP接続で2台のコンピュータでチャットをするプログラムを作ってます。
そこで、バインドしたときに相手からの接続がされてるかどうかの確認をする機能をつけたいと思っているのですが良い方法が思いつきません。
何か教えていただけたらと思います。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>UDP接続で2台のコンピュータでチャット


2台のPCでのチャットならTCP/IPの方がいいのでは・・・

UDPはエラー処理をしてくれないですけど、そこら辺のロジックも大丈夫ですか?
複数人数同時参加のチャットならUDPで組むと、早くすることも可能だけど、2台ならあまり意味が無いような気がするのは僕だけでしょうか?

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

ありがとうございます。UDPとTCPのちがいがはっきりわかっていないところもあったので、今回の回答は大変助かりました。ところでUDPは何の通信にむいてるのでしょうか?

お礼日時:2001/12/18 12:15

>Winsockを使ってVBでチャット


 を作るなら、TAGOSAKU7 さんがおっしゃるように TCP/IPのほうがいいと思います。

なにか他の事情があって、UDPでいくのなら、接続確認はアプリの手順で考えなくてはいけません。
TCP/IPは、「回線を接続する」という概念がありますが、UDPの場合にはありません。(自分のポートではなく、相手も含んだ接続回線と言う意味です)

その辺をふまえて・・・・

>良い方法が思いつきません。
私の場合は、特定のポートを接続確認用に、チャット用とは別にポートを使っています。
チャット参加者テーブルから、相手に対して問合せ文字を送り、また、問合せ文字に対しては、確認文字を返します。
これで、複数の会議形式のチャットができます。
決してベストの方法ではなく、簡易さとか速度のバランスから実践的に使っているという程度です。

#COMポートの結線と似たような考え方です。
    • good
    • 0
この回答へのお礼

あいがとうございます。さっそく参考にさせていただきたいとおもいます。
しかし、UDPはどんな通信にむいているのでしょう?

お礼日時:2001/12/18 12:20

sckClosed 0 (既定値) 閉じています。


WinsockコントロールのStateプロパティで状態がわかります。

参考までに定義と値を載せておきますね。

sckOpen 1 開いています。
sckListening 2 接続要求を待っています。
sckConnectionPending 3 接続がペンディング状態になっています。
sckResolvingHost 4 ホストの解決処理中です。
sckHostResolved 5 ホストの解決が完了しました。
sckConnecting 6 接続処理中です。
sckConnected 7 接続が完了しました。
sckClosing 8 相手側のマシンが接続を閉じようとしています。
sckError 9 エラー。
    • good
    • 0
この回答へのお礼

回答していただきありがとうございました。
UDPにもこの定義を使うことができるのですか。
1度試したのですけどうまくいかないかったのであきらめてましたが、もう一度試してみようと思います。

お礼日時:2001/12/17 16:46

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qwinsock通信時エラーの回避

winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。

サーバー側(winsock部分)記述

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop

On Error Resume Next
Winsock1(Index).Listen
If Winsock1(Index).LocalPort <> 0 Then
Winsock1(Index).LocalPort = 0

End If

End Sub


質問の整理ですが、
表示板にはギミックが付いておりそのギミックは止まらないのでパソコンのフリーズでは無い様子です。
で問題は通信部分だと推測されるのですが、そのエラーを起こした通信を破棄してもいいので、サーバー側の点数加算を止めない方法はありませんでしょうか。
また上記のWinsock1_Errorコードの記述じゃおかしいのでしょうか。

winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。

サーバー側(winsock部分)記述

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

Winsock1(Index).Close '接...続きを読む

Aベストアンサー

現象が発生するのはまれでしょうか?

試してみましたがクライアントから連続してconnectすると発生しやすいようです。
ただ、このエラーが発生しても、特に異常が見られないので、このエラーを無視してはどうでしょうか?

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

If Index = 0 Then ' 受け付けるポートと接続するポートは処理が違う
If Number <> 10035 Then ' エラーコード10035は、無視
Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop
On Error Resume Next
Winsock1(Index).Listen
End If
Else
Winsock1(Index).Close '接続を閉じる
Do While Not (Winsock1(Index).State = sckClosed)
DoEvents
Loop
Unload Winsock1(Index)
closedSocks.Add Index
End If

End Sub

現象が発生するのはまれでしょうか?

試してみましたがクライアントから連続してconnectすると発生しやすいようです。
ただ、このエラーが発生しても、特に異常が見られないので、このエラーを無視してはどうでしょうか?

Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

If Index = 0 Then ' 受け付けるポートと...続きを読む

QVBAでDateaddの日付計算で困っていることがあるので助けていただけないでしょうか。よろしくお願いします。

シート:
A列には”注射”という文字を入れるようにします。
B列には1月1日から12月31日まで入っています。
C列はB列の90日後を入れるようにします。
D列はC列の3日前を入れます。・・・としたいのですがその3日の間A列に”注射”が入っていたらその日を入れずに3日前にしたいのです。 稼働日みたいな感じでしょうか・・・・
どうしたらよいでしょうか?お願いします。

例えば、B列の「1月1日」の90日後はC列「3月31日」でD列は通常「3月28日」が入っていますがB列「3月30日」の左のA列に”注射”があったらそこを無視して「3月27日」と入れたいのです。

Sub count()
Dim i As Long
Dim lastrow As Long
lastrow = Range("B1").End(xlDown).Row
For i = 1 To lastrow
Cells(i, 3).Value = DateAdd("d", 90, Cells(i, 2).Value)
Next
For i = 1 To lastrow
Cells(i, 4).Value = DateAdd("d", -3, Cells(i, 3).Value)
Next
End Sub

説明が下手なのでもしよかったら実際作ったものを見ていただいた方が分かるかもしれません。
http://briefcase.yahoo.co.jp/bc/robert_kubica_bmw/vwp2?.tok=bcf8oGbB4FXgt88k&.dir=/&.dnm=1count.xls&.src=bc

シート:
A列には”注射”という文字を入れるようにします。
B列には1月1日から12月31日まで入っています。
C列はB列の90日後を入れるようにします。
D列はC列の3日前を入れます。・・・としたいのですがその3日の間A列に”注射”が入っていたらその日を入れずに3日前にしたいのです。 稼働日みたいな感じでしょうか・・・・
どうしたらよいでしょうか?お願いします。

例えば、B列の「1月1日」の90日後はC列「3月31日」でD列は通常「3月28日」が入っていますがB列「3月30日」の左のA列に”注射”があった...続きを読む

Aベストアンサー

色々と勘違いがあるようでスイマセン。
これでどうでしょうか?

Sub count()
  Dim i, j
  Dim BLK
  
  With ActiveSheet
    For i = 1 To .Range("B1").End(xlDown).Row
      .Cells(i, "C") = .Cells(i, "B") + 90
      .Cells(i, "D") = .Cells(i, "B") + 90
      BLK = 0
      '90日後の1日前からA列値が"注射"でない日を三つカウントするまで日付を遡る
      For j = i + 89 To 1 Step -1
        If .Cells(j, "A").Value <> "注射" Then
          BLK = BLK + 1
        End If
        .Cells(i, "D") = .Cells(i, "D") - 1
        If BLK = 3 Then Exit For '注射ではない日を3個カウントしたので遡る処理を中止
      Next
    Next
  End With
End Sub

色々と勘違いがあるようでスイマセン。
これでどうでしょうか?

Sub count()
  Dim i, j
  Dim BLK
  
  With ActiveSheet
    For i = 1 To .Range("B1").End(xlDown).Row
      .Cells(i, "C") = .Cells(i, "B") + 90
      .Cells(i, "D") = .Cells(i, "B") + 90
      BLK = 0
      '90日後の1日前からA列値が"注射"でない日を三つカウントするまで日付を遡る
      For j = i + 89 To 1 Step -1
        If .Cells(j, "A").Value <> "注...続きを読む

QWinsockのオブジェクトエラー

こんにちは。EXCEL2000・VBAで、Winsockの使用を考えています。
以下のソースコードを入力して、実行してもオブジェクトが見つかりませんという、エラーが出力されてしまいます。
また、Winsockをアクティブにしようと、
User FormにWinsockのアイコンを追加しようとしても
「サブジェクトは指定された操作に対して信頼されません」
という注意書きがでてしまって、追加できません。
なぜ、このようになるのか、教えていただけますか?
よろしくお願いします。

Private Sub CommandButton1_Click()
Winsock1.RemoteHost "www.yahoo.co.jp"
Winsock1.RemotePort 80
Winsock1.Connect
End Sub

Private Sub CommandButton2_Click()
Winsock1.SendData = TextBox1.Value
End Sub

Private Sub CommandButton3_Click()
Winsock1.Close
End Sub

こんにちは。EXCEL2000・VBAで、Winsockの使用を考えています。
以下のソースコードを入力して、実行してもオブジェクトが見つかりませんという、エラーが出力されてしまいます。
また、Winsockをアクティブにしようと、
User FormにWinsockのアイコンを追加しようとしても
「サブジェクトは指定された操作に対して信頼されません」
という注意書きがでてしまって、追加できません。
なぜ、このようになるのか、教えていただけますか?
よろしくお願いします。

Private Sub CommandButton1_Click()
Wi...続きを読む

Aベストアンサー

こんにちは。

以下の内容が的外れだった場合はすみません。m(__)m

下記の参考サイトに書かれているように、Windowsの更新プログラムによりActiveX コントロールが
使えなくなってしまうことによる障害かもしれません。

この場合、現状での対策としては更新プログラム(KB960715)をアンインストールする以外ないように
思われます
注)但し、KB960715をアンインストールした場合、セキュリティが脆弱になる恐れがありますので
  ご注意下さい。

■参考サイト
【Vista】WindowsアップデートによりVBAでActiveXコントロールが使えなくなる
http://lunasite.blog79.fc2.com/blog-entry-56.html

答えてねっと - VBAで今まで使っていたMSFlexGridコントロールが使えなくなった
http://www.biz.kotaete-net.net/Default.aspx?pgid=14&qid=401994224

net3: VBA のマクロとかで FlexGrid が動かない時
http://net-3.blogspot.com/2009/03/vba-flexgrid.html

【VBA】MSHFlexGridの利用不可について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=48226&forum=7&6

■関連情報
Windows XP の ActiveX Killbits に対するセキュリティ更新プログラム (KB960715)
http://www.microsoft.com/downloads/details.aspx?familyid=18521F44-2861-4A3D-9605-3A9155A737A7&displaylang=ja

Windows Vista の ActiveX Killbits に対するセキュリティ更新プログラム (KB960715)
http://www.microsoft.com/downloads/details.aspx?FamilyID=437defa2-2d07-4718-a4e1-87f96dc73d44&DisplayLang=ja

こんにちは。

以下の内容が的外れだった場合はすみません。m(__)m

下記の参考サイトに書かれているように、Windowsの更新プログラムによりActiveX コントロールが
使えなくなってしまうことによる障害かもしれません。

この場合、現状での対策としては更新プログラム(KB960715)をアンインストールする以外ないように
思われます
注)但し、KB960715をアンインストールした場合、セキュリティが脆弱になる恐れがありますので
  ご注意下さい。

■参考サイト
【Vista】WindowsアップデートによりV...続きを読む

Qvb2005でUDP受信時にフォームが表示されない

はじめまして
VB2005でUDPのメッセージを受信してForm上のLabelに受信内容を表示させるサンプルプログラムを作成したのですが、「デバック開始」をクリックしてもFormのウィンドウ自体が表示されません。
イミディエイトにdebug.printで受信データは表示されていますのでプログラム自体は正常に動作しているようです。
どなたかアドバイスをいただけませんでしょうか。

Public Class Form1
Dim localport As Integer = 1111

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'文字コードを指定する
Dim enc As System.Text.Encoding = System.Text.Encoding.UTF8

' バインド
Dim udp As New System.Net.Sockets.UdpClient(localport)

' 受信
Dim remoteEP As System.Net.IPEndPoint = Nothing

Debug.Print("受信開始")
Do
My.Application.DoEvents()
Dim rcvBytes As Byte() = udp.Receive(remoteEP)
Dim rcvMsg As String = enc.GetString(rcvBytes)
My.Application.DoEvents()

Debug.Print("受信メッセージ:" & rcvMsg)
Label1.Text = rcvMsg
Loop
End Sub
End Class

はじめまして
VB2005でUDPのメッセージを受信してForm上のLabelに受信内容を表示させるサンプルプログラムを作成したのですが、「デバック開始」をクリックしてもFormのウィンドウ自体が表示されません。
イミディエイトにdebug.printで受信データは表示されていますのでプログラム自体は正常に動作しているようです。
どなたかアドバイスをいただけませんでしょうか。

Public Class Form1
Dim localport As Integer = 1111

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System....続きを読む

Aベストアンサー

Formが表示されるのは Loadイベントを抜けた後になります

Loadイベント中に Do ... Loop で無限ループを作っているので
.NET Frameworkがフォームを表示することはありません

フォームを表示するのであればループに入る前に Me.Show() などを実行しましょう

本来なら ボタンなどを準備してそのクリックイベントなどを使うようにしたほうがいいと思います

Qwinsockの配列(1対多数のプログラム)

お世話になります。VBで1対多数の通信プログラムを作っているのですが、受けて側をConnectionRequest
のプロシージャで
If Index = 0 Then

sockNum = sockNum + 1

Load Winsock1(sockNum)


Winsock1(sockNum).LocalPort = 0


Winsock1(sockNum).Accept requestID

としてコントロール配列をさせています。

通信は問題ないのですが、WinsockのIndexがIntegerの上限まできたら、オーバーフローを起こします。
リセット、もしくは回避の方法がまったくわからず困っています。どうぞお力お貸しください。

Aベストアンサー

 VBのWinSockコントロールは色んな所にサンプルあるけど、みんなこのタイプよね。たしかMSDNのもこれ。まぁサンプルなのでしかたないとしても、実際に利用する場合は1番以上の番号を再利用する形にしてあげないといけない。
 激簡単なサンプルを書いてみたので参考にして欲しい(今ささっと書いた奴なので動かなければ修正よろしく)。Form1にWinSock1を置いて実行してね。

Option Explicit

Private sockNum As Integer
Private closedSocks As Collection

Private Sub Form_Load()
Set closedSocks = New Collection
Winsock1.Item(0).Bind 9900
Winsock1.Item(0).Listen
End Sub

Private Sub Winsock1_Close(Index As Integer)
Unload Winsock1(Index)
closedSocks.Add Index
End Sub

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
Dim connectsocknum As Integer
If closedSocks.Count > 0 Then
connectsocknum = closedSocks.Item(1)
closedSocks.Remove 1
Else
sockNum = sockNum + 1
connectsocknum = sockNum
End If
Load Winsock1(connectsocknum)
Winsock1.Item(connectsocknum).Accept requestID
End If
End Sub

Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim data As Variant
Winsock1.Item(Index).GetData data
Winsock1.Item(Index).SendData data
End Sub

 VBのWinSockコントロールは色んな所にサンプルあるけど、みんなこのタイプよね。たしかMSDNのもこれ。まぁサンプルなのでしかたないとしても、実際に利用する場合は1番以上の番号を再利用する形にしてあげないといけない。
 激簡単なサンプルを書いてみたので参考にして欲しい(今ささっと書いた奴なので動かなければ修正よろしく)。Form1にWinSock1を置いて実行してね。

Option Explicit

Private sockNum As Integer
Private closedSocks As Collection

Private Sub Form_Load()
Set closedSoc...続きを読む

QUDP処理のエラーについて

疑問に思ったので教えて下さい。
以下のようにBeginReceive処理を複数回行うとエラーが発生します。
これは1つのポートにおけるバッファが限界に達したためなのでしょうか。
' 変数宣言
lUdpClient = New UDPState()
lUdpClient.netPoint = New Net.IPEndPoint(Net.IPAddress.Any, iLocalPort)
lUdpClient.udp = New Net.Sockets.UdpClient(lUdpClient.netPoint)

For i = 0 To 3000
lUdpClient.udp.BeginReceive(AddressOf SendData, lUdpClient)
Next

システムのバッファ領域が不足しているか、またはキューがいっぱいなため、ソケット操作を実行できませんでした。

疑問に思ったので教えて下さい。
以下のようにBeginReceive処理を複数回行うとエラーが発生します。
これは1つのポートにおけるバッファが限界に達したためなのでしょうか。
' 変数宣言
lUdpClient = New UDPState()
lUdpClient.netPoint = New Net.IPEndPoint(Net.IPAddress.Any, iLocalPort)
lUdpClient.udp = New Net.Sockets.UdpClient(lUdpClient.netPoint)

For i = 0 To 3000
lUdpClient.udp.BeginReceive(AddressOf SendData, lUdp...続きを読む

Aベストアンサー

> 一度Sendした場合、受信待ち状態が解除されるので、
> 再度BeginReceiveを呼び出しています。

元々コールバック関数中でBeginReceiveを呼び出しておらず,
その場合には一度だけコールバック関数が呼ばれるために,
Sendで受信待ち状態が解除されると勘違いした,ということはないですか。

UdpClient.Sendはsendto WinSock2 APIを呼び出すのですが,
このAPIはRecvFrom WinSock2 APIによるoverlapped I/Oを阻害しません。

わかりにくいなら,受信用のソケットと送信用のソケットを分離してしまうのも一つの方法だと思います。

QWinsockについて

OS :WindowsXP
開発言語 :VC++
Winsock :2.2

現在、Winsockプログラムにて下記のようなテストをしています。

接続 ⇒ データ送信(正常) ⇒ LANケーブル抜く ⇒ データ送信(当然エラー)
⇒ LANケーブル挿す ⇒ データ送信 ・・・ ←ここでもエラーが発生してしまいます。

Winsockの通信は一度切れてしまうと最初から接続しなおさないと駄目なのでしょうか。

Aベストアンサー

最初から接続しなおさないと駄目です。

ちなみに、その挙動は、
Winsockの問題ではなく、OS(WindowsXP)のTCP/IP仕様によるものです。

参考URLに下記の記述があります。
>Windows では、メディアの "ダウン" 状態が検出されると、
>再度 "アップ" として検出されるまで、
>そのアダプタにバインドされているプロトコルは削除されます。

このプロトコル削除が発生すると、
WindowsOSは、プログラムがWinsockで作成した通信の接続情報を
全て破棄してしまいます。

OSに接続情報を破棄されてしまうので、
プログラム側は、再度接続しなおすしか、対処方法がありません。

参考URL:http://support.microsoft.com/kb/239924/ja

QDataGridのバインドで苦しんでおります

DataAdapterを使わずに仮想テーブルとバインドさせる事は可能なのでしょうか?(DBの接続が常時接続なので…)
イメージなのですが、
(1)仮想テーブル作成
(2)DataGridと(1)をバインド

漠然とした質問で申し訳ありません。宜しくお願いいたします。

Aベストアンサー

可能です。

・DataTableオブジェクト.Add
・DataColumnオブジェクト.Add
を組み合わせて、データビューを作成しましょう。



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim l_dtbデータテーブル As New DataTable()
  Dim l_drwデータロウ As DataRow
  Dim i As Integer

  l_dtbデータテーブル.Columns.Add("文字型", System.Type.GetType("System.String"))
  l_dtbデータテーブル.Columns.Add("整数型", System.Type.GetType("System.Int32"))
  l_dtbデータテーブル.Columns.Add("長整数型", System.Type.GetType("System.Int64"))

  For i = 1 To 26
    l_drwデータロウ = l_dtbデータテーブル.NewRow
    l_drwデータロウ.Item("文字型") = Chr(48 + i) & Chr(64 + i)
    l_drwデータロウ.Item("整数型") = i * 1000
    l_drwデータロウ.Item("長整数型") = i * 1000000
    l_dtbデータテーブル.Rows.Add(l_drwデータロウ)
  Next

  Dim l_dvwデータビュー As DataView = New DataView(l_dtbデータテーブル)
  DataGrid1.DataSource = l_dvwデータビュー
End Sub

可能です。

・DataTableオブジェクト.Add
・DataColumnオブジェクト.Add
を組み合わせて、データビューを作成しましょう。



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim l_dtbデータテーブル As New DataTable()
  Dim l_drwデータロウ As DataRow
  Dim i As Integer

  l_dtbデータテーブル.Columns.Add("文字型", System.Type.GetType("System.String"))
  l_dtbデータテーブル.Columns.Add("整数型", System....続きを読む

QWinsockコントロールを使用してマルチキャスト通信

まずは環境を
WindowsXPSP2、VisualBasic6.0SP6です。

目的はサーバがマルチキャスト配信しているのを
VBのクライアントがWinsockコントロールを使用して受信する方法を教えていただきたいのです。

Winsockコントロールを使用してUDPでの通信ができたのですが
WinsockコントロールにはCの「setsockopt」に該当する命令が無い(わからない)のです。

Winsockコントロールで実現できないのであれば
winsockのAPIを使用する方法でもかまわないのですが
APIの情報も見つからず困っています。
APIを実装しても「IPPROTO_IP」「IP_ADD_MEMBERSHIP」などの定数の定義の情報がなくわからないのです。

これらの情報が載っているページや、解説しているページがあればお教えください。
または実装方法を知っておられるならお教えください。
よろしくお願いします。

Aベストアンサー

今、似たようなことをやっています。
ヘッダからとってきます。

■プロトコル
#define IPPROTO_IP 0

■マルチキャスト
winsockのバージョンによって異なる

1)version 1
winsock.hから
#define IP_ADD_MEMBERSHIP 5
#define IP_DROP_MEMBERSHIP 6

2)version 2
WS2TCPIP.hから
#defineIP_ADD_MEMBERSHIP 12
#defineIP_DROP_MEMBERSHIP 13

VBのWinsockコントロールのバージョンは知りません。
MFCのソケットクラス使ってたらversion1です。

Qコンピュータ用語について

コンピュータ用語ってカタカナ読みをした時、最後に”ー”がついても
記述するときには書いてはいけませんよね。
どうしてですか?
例えば "server"を"サーバ"と書くのはなぜ?

Aベストアンサー

工学系には戦前から、「三音節以上の単語は、語尾の長音符号を省略する」という不文律というか慣習がありました。理学系(自然科学系)ではそういう習慣はなかったのですが、戦後になって表記を統一しようとする動きがあった際、工学系と理学系が対立し、国語審議会が「省く慣習のあるものについては、必ずしも付けなくてもよい」という答申を出したことで(1952)、長音省略という工学の伝統が公認され、現在に至っている、ということのようです。
コンピュータ(ー)関連用語はJISで規格が定められていますが、このJISじたい工業規格ですから、工学の伝統をそのまま引きずっているわけです。
実際に英単語"-er"や"-or"の語尾を聞くと、たしかに伸ばしているように聞こえるので、長音符号省略はけっして原音に忠実の結果ではありません。ではどうして略すかというと、どうやら「一つの単語が長くなりすぎるから」という配慮が根底にはあるようですね。
(参考:対論「コンピューターかコンピュータか」朝日新聞1997.12.20)


人気Q&Aランキング

おすすめ情報