掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Socket通信の書き換え(pythonより) (ID:149871)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
送受信方法は検索するとすぐ出るのですが・・・ https://nadesi.com/delphi/winsock/3-0-connect.htm これを参考に ボタン1つとメモ1つ置いてボタンイベント内に書いてみました。 Delphi2007までは動作するけどそれ以降のバージョンだと動かないみたいなので 少し修正したのがこちらになります。 これで送信と受信は動きます。 その後におそらく ・URLじゃなくてIPアドレスを指定する場合は? ・URLを間違うと固まるし変換に時間がかかるのなんとかならない? ・受信データが来るまで固まるのなんとかならない? など寄せられるかもしれませんが、それは便利なIndyを使うか ご自身で解決していただければと思います。 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,WinSock, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var WSAData: TWSAData; phe: PHostEnt; s: TSocket; sockadd: sockaddr_in; buf,str: Ansistring; cnt: Integer; bufs: array[0..1024] of Byte; begin // WinSock 初期化 WSAStartup($0101, WSAData); //--------------------------- // ソケットを作成 ... (1) s := socket(PF_INET, SOCK_STREAM, 0); if(s = INVALID_SOCKET)then raise Exception.Create('ソケットを作成できませんでした。'); //--------------------------- // ホスト情報を得る phe := gethostbyname('www.google.com'); if phe = nil then raise Exception.Create('ホストがみつかりません。'); // 接続先アドレスを設定 ... (2) ZeroMemory(@sockadd, Sizeof(sockadd)); sockadd.sin_family := AF_INET; sockadd.sin_port := htons(80); sockadd.sin_addr := PInAddr(phe.h_addr_list^)^; //--------------------------- // 接続 if WinSock.connect(s, sockadd, sizeof(sockadd)) <> 0 then raise Exception.Create('接続できませんでした。'); SetLength(buf, 1024 * 8); // 8Kのバッファ //--------------------------- // 送信 ...(3) str := 'GET ./ HTTP/1.0'+#13#10#13#10; FillChar(bufs, SizeOf(bufs), #0); StrCopy(@buf[1], PChar(str)); StrCopy(@bufs[1], PChar(str)); send(s, bufs, Length(bufs), 0); //send(s, str[1], Length(str), 0); //--------------------------- // 受信 ...(4) while True do begin SetLength(buf, 1024 * 8); // 8Kのバッファ ZeroMemory(PChar(buf), Length(buf)); // メモリの初期化 cnt := WinSock.recv(s, buf[1], Length(buf)-1, 0); //cnt := WinSock.recv(s, bufr[1],SizeOf(bufr), 0); if cnt = 0 then Break; if cnt = SOCKET_ERROR then begin cnt := WSAGetLastError; writeln('受信エラー=', cnt); Break; end; SetLength(buf,cnt); Memo1.Lines.Add(buf); //Writeln(string(PChar(buf))); // 受信したデータを画面に表示 if Length(buf) > cnt then Break; // データを読みきった end; //--------------------------- // 切断...(5) if (shutdown(s, SD_BOTH) <> 0) then writeln('シャットダウンに失敗'); closesocket(s); WSACleanup; end; end.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.