Linux,BSDSocket

ethernetの接続。
nmtuiの設定において、IPv6を無効化することで接続できるようになることがある。
このエントリーをはてなブックマークに追加

先にsuで管理者権限を持ってから、

nautilus コマンドをターミナルへ打つ。
このエントリーをはてなブックマークに追加

※ここに書かれている内容は、私の経験則に基づいている内容であり、確証があるわけではない。

connect後にすぐsendを行うと、データが送信されないことがある。
そういうときは、connectの後に、0.3秒程ウェイトを作り、sendするとうまくいく。


経験上、sendが成功したりしなかったりするプログラムに対して有効である。

TCPでは、相手がデータを受け取れなかったとき、そのパケットを再送する。
このとき、他に送信したいデータがあれば、それを再送予定のパケットの最後尾に付加して送信する。
そのため、パケットに複数の境界があるデータを処理できないrecv関数を使用している場合、受信側でパケットを取りこぼしてしまうのである。
このエントリーをはてなブックマークに追加

sendto(sock, buf, buflen, 0, addrinfo->ai_addr, addrinfo->ai_addrlen);

データが中途半端に送信される場合、buflenの数字を大きくしてあげると送信されるかもしれない。
例:「こんにち」まで送信されるが、「こんにちは」と送信されない。

一部の参考書では、buflenはbufのサイズを示すと書かれているが、
より正確には、「buflenの分だけ送信する」となる。
このエントリーをはてなブックマークに追加

前者は後方の引数2つにNULLを指定できる。

NULLを指定すると、送信元アドレスと送信元アドレスの長さが自動的に格納される。

Windowsアプリケーション側でrecvfromを使う場合
recvfrom(sock, buf, sizeof(buf) - 1, 0, NULL, NULL);


Linuxアプリケーション側でrecvfromを使う場合
clientbuflen = sizeof(client);
recvfrom(sock, buf, sizeof(buf) -1, 0, (struct sockaddr *)&client, &clientbuflen);

このエントリーをはてなブックマークに追加

↑このページのトップヘ