WinSockについて

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: WinSockについて

返信が送れてすいません。

by kobu » 2006年7月29日(土) 01:07

教えてもらった通りに、調べてやってみた結果。

サーバー側をWebに公開するような形にしたら接続に成功しました。
確かにローカル内ではグローバルIPでは接続できませんでした。

いろいろ教えていただき、ありがとうございました。

by ゲスト » 2006年7月25日(火) 08:40

通常、サーバーに対するポートの開放をルーターで行う必要があります。
IPマスカレード設定・・・みたいな項目がルーターの設定であると思います。

たとえば、サーバーが192.168.0.10にあるとして、
通信にはポート80を使用する場合、
192.168.0.10に対して、ポート80を開放しないといけません。
設定方法は、ググレば色々見つかると思います。

あとは、グローバルIPの実験をしたときに、どういう環境だったのかが
わかるとコメントしやすいですね。

たとえば、サーバーは自分で、クライアントは友達に実験を手伝ってもらったとか。
ローカル環境内にサーバーとクライアントを両方おいた場合、
グローバルIPのデバッグは通常出来ないと思います。
そのままグローバルIPを指定しても、相手が見つからなくてエラーというのも
納得できます。
グローバルIPを持っているのは、あくまでモデムですからね。

WinSockについて

by kobu » 2006年7月25日(火) 00:14

ちょっとした、チャットプログラムを組もうとしているのですが、実験段階でつまづいてしまいました。
Socketプログラムの知識があまりないので、これできるかどうかどうかも分かりませんがどなたか、教えてください。

サーバー側

コード: 全て選択


#include "WinSock.idx"

'---------------------------
'  Window Message Loop
'---------------------------
Dim msgMain As MSG, iResult As Long
Do
	iResult=GetMessage(msgMain,0,0,0)
	If iResult=0 or iResult=-1 Then Exit Do
	TranslateMessage(msgMain)
	DispatchMessage(msgMain)
Loop

' Call destructores and exit process
End
Declare Function bind Lib "ws2_32.dll" (s As DWord, ByRef name As Any, namelen As Long) As Long
Declare Function listen Lib "ws2_32.dll" (s As DWord, backlog As Long) As Long
Declare Function accept Lib "ws2_32.dll" (s As DWord, ByRef name As Any,ByRef namelen As Long) As Long
Declare Function WSAGetLastError Lib "ws2_32.dll" () As Long

Function main() As Dword
 Dim wsaData As WSADATA,l As Long,buf[10] As Byte
 Dim sock As Dword,sock0 As Dword,le As Long
Dim addr As SOCKADDR_IN
Dim client As SOCKADDR_IN
 WSAStartup(MAKEWORD(2,0),wsaData)
 sock0 = socket(AF_INET, SOCK_STREAM, 0)
 addr.sin_family = AF_INET
 addr.sin_port = htons(12345)
 addr.sin_addr=htonl(0)
 l=bind(sock0,addr, len(addr))
 listen(sock0, 5)
 le = Len(client)
 sock = accept(sock0,client,le)
lstrcpy(buf,"HELLO")
 ' 5文字送信
 send(sock,buf , 5, 0)
 ' TCPセッションの終了
 closesocket(sock)
 WSACleanup()
End
End Function
クライアント側

コード: 全て選択


#include "WHost.idx"

'---------------------------
'  Window Message Loop
'---------------------------
Dim msgMain As MSG, iResult As Long
Do
	iResult=GetMessage(msgMain,0,0,0)
	If iResult=0 or iResult=-1 Then Exit Do
	TranslateMessage(msgMain)
	DispatchMessage(msgMain)
Loop

' Call destructores and exit process
End
Declare Function inet_addr Lib "ws2_32.dll" (cp As BytePtr) As Long
Declare Function WSAGetLastError Lib "ws2_32.dll" () As Long

Function main() As Dword
 Dim wsaData As WSADATA,l As Long,k As String
 Dim sock As Dword,buf[256] As Byte,i As long
 Dim sockaddress As SOCKADDR_IN,h[32] As Byte
i=WSAStartup(MAKEWORD(2,0), wsaData)
' // ソケットの作成
 sock = socket(AF_INET, SOCK_STREAM, 0)

' // 接続先指定用構造体の準備
 sockaddress.sin_family = AF_INET
 sockaddress.sin_port = htons(12345)
 sockaddress.sin_addr = inet_addr("x.x.x.x")

' // サーバに接続
 l=connect(sock,sockaddress, Len(sockaddress))

' // サーバからデータを受信
l=WSAGetLastError()
 recv(sock, buf,7, 0)
k=Str$(l)+MakeStr(buf)
 msgbox 0,k

 WSACleanup()
End Function
で、x.x.x.xをローカルIPアドレスを指定すると、LAN内のパソコンでは、反応します。
グローバルIPアドレスにすると、エラーコードがタイムアウトになって帰ってきます。
PCのファイアウォールを切っても反応がありませんでした。
グローバルIPでも反応するにはどうすればいいと思いますか?
ルータの設定とかをいじらないといけないのでしょうか?

ページトップ