2007年12月12日水曜日



パソコンを新しくした



ベアボーン ASUS V3-M2V890 13k


CPU AMD Athlon X2 BE-2400 13k


memory ノーブランド 1G*2 6k 


VGA HD 2400 PRO SCS3 256MB 7k





HDD,DVDは旧を流用して合計約39,000円。


ベアボーンは楽でいいです。


BE-2400がサポートのリストに無かったけれど、最新のBIOSで対応されてる。





困った


1.SATAがIDEより後になってるので、SATAのリムーバブルディスクをつけるとブートしない。(BIOSの設定 でなんとかなるか?)


 →リムーバブルを外付けで使うことにした。


2.CPUの温度を見るとBIOSでも25-30℃ぐらいにしかならない、正しいのか?


3.ケースファンが付いてない。ケース内の温度は30℃前後になってる。CPUより高いけど正しいのか?


 →電源を切った直後にケースを開けて手を入れてみたけれで、かなり温度が低そう。CPUは分からな  いけれど、ケース内は正しそう。





ファンが付いてなくて、かなり静かになりました。でも夏場は怖いのでケースファンはつけようかな。





最近のCPUは単純にクロックだけでは、性能がよくわからない。とりあえず、いつも通り10k前後のものを買うというパターンでいってみた。


デュアルコアって良く分からないけど、まあ前のマシン(Celeron D335)より早くなったし、静かにもなったし大満足。





2007年10月29日月曜日

Windows Mobile 2003のプログラミング



C#でやるのがいいのかな?


ってことで、C#の勉強をしてみることにしました。


C#のいい本を探してみる。


WindowsCE関係のプログラミング関係の本があんまりない。





WILLCOMなんかでスマートフォンはやって、すこしは増えてるのかな。


WILLCOM携帯アプリプログラミングブック


ISBN:4839919682





Windows Mobile 5.0 アプリケーション開発 Beginner's Book


ISBN:4774128910






VS2003は持ってるので、追加で必要なSDKなどのリンクのメモ。


eMbedded Visual C++ 4.0 (日本語版)


http://www.microsoft.com/japan/msdn/vstudio/device/evc_download.aspx





eMbedded Visual C++ 4.0 SP3 (日本語版)


http://www.microsoft.com/downloads/details.aspx?FamilyID=5bb36f3e-5b3d-419a-9610-2fe53815ae3b&displaylang=ja





Windows Mobile 2003 Second Edition-based Pocket PC 用エミュレータ (英語)


http://www.microsoft.com/downloads/details.aspx?FamilyId=4953D34D-692F-4C87-AC69-CB235DBDAD1D&displaylang=en





Windows Mobile 2003 software for Pocket PC 日本語版 ソフトウェア開発キット (SDK) (日本語版)


http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=9996B314-0364-4623-9EDE-0B5FBB133652





Windows Mobile 2003 - based Pocket PCs : 他言語エミュレータ イメージ (英語)


http://www.microsoft.com/downloads/details.aspx?FamilyID=57265402-47a8-4ce4-9aa7-5fe85b95de72&DisplayLang=en





2007年10月17日水曜日

買ってみた



少し臨時収入があったのでPDAを買ってみました。


ipaqの2410で無線LANもついてて思いのほかいい感じです。


通勤電車のなかで音楽を聞きながらpdfの文章を読んだりしてます。


さすがに長文はかけないなぁ・・


これぐらいの長さで限界です。





2007年10月16日火曜日

4.22の設定



やること:


1.無線LANの設定(PCMCIAの周辺が変更?orinocoのドライバがないみたい)


ドライバはカーネルに組み込まれることになったようなので、ついでに色々いじってカーネルを再構築してみまた。


2.Subversionのインストール(contrib)


3.FluxBoxが1.0になったのでコンパイルしなおして、設定も1からやりなおす。


/usr/local/share/fluxboxの中身を$HOME/.fluxboxにコピーして色々いじる。





2007年10月1日月曜日

シグナル



カーネルやユーザからプロセスになにかを通知するために送られる。


何種類かあって、それぞれにデフォルトの動作が決まっているが、


デフォルトで無視されるものもある。


システムコールを捕捉(キャッチ、トラップ)して、プロセスが受け取った


ときに動作(シグナルハンドラ)を変更できる。





キャッチできないシグナルもある。例えばSIGKILLは、確実にプロセスを終了させる


ために、変更したりできなくなっている。











int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact)


対象シグナルを指定して、プロセスが受け取った際の動作を変更する。





signum


対象となるシグナルを指定する。


SIGKILLとSIGSTOPは、指定できない。





const struct sigaction *act


シグナルを受け取った時の動作などを指定する。



struct sigaction{


void (*sa_handler) (int);


void (*sa_sigaction) (int,siginfo_t *,void *);


sigset_t sa_mask;


int sa_flags;


void (*sa_restorer) (void);


}






sa_handlerとsa_sigactionは、どちらかのみを利用して、シグナルハンドラを指定する。


sa_maskは、ブロックするシグナルを指定するのに使う。


シグナルは、プロセスが実行されている時のいつ送られてくるか分からない。そうすると、シグナルハンドラ実行中に、同じシグナルが送られてきて、シグナルハンドラが二重にじっこうされるかもしれない。それを止めるために、シグナルハンドラ実行中にシグナルが送られてきたとき、そのシグナルを保留(ブロック)しておく。


このブロックしておくシグナルを指定するのにsa_maskを使う。


sigaction()で、シグナルハンドラ実行中は、基本的にsigaction()で指定されているシグナルはブロックされる。





マスクをつくる関数


int sigemptyset(sigset_t *set);マスクsetを空にする。


int sigfillset(sigset_t *set); マスクsetに全てのシグナルを指定する。





struct sigaction *oldact


sigaction()が実行されたときのシグナルハンドラが入る。


必要ないときはNULLを指定。








理解できてるような、できてないような中途半端な感じ。。。。





2007年9月24日月曜日

CD-Plamoをカスタマイズしてみる



いろいろな都合でCDから起動する環境が必要になりました。


そこで、いつも使っているPlamoLinuxをベースにしたCD-Plamoを使うことにしました。


Knoppixとかも使ってみたんですが、やっぱり少し豪華すぎる気がしちゃいました。


ということで、CD-Plamoを使っていたんですが、いろいろいじりたくなったので、なんとなくでいじってみました。





●準備


contribからmkisosfをインストールしておく。それとディレクトリを圧縮する必要があるので、mkzftreeコマンドをインストールしておきます。


mkzftreeコマンドは、zisofsからソースをダウンロードできます。





CDの中味を全てコピーします。


CD-Plamoは、特殊な圧縮方式をつかっているので、Linux上で作業する必要があります。


デバイスをコピーするんでrootで作業します。



/root

|__/work

|__/CDPlamo  (ここにコピーしました)








chroot


chrootというコマンドを利用することで、指定したディレクトリを仮想的に'/'とすることができます。






#cd /root/work


#chroot /CDPlamo /bin/bash






これで/CDPlamoディレクトリを'/'としてbashを起動します。


これ以降は、このbash上で作業を行いますが、このシェルでは、/root/work/CDPlamoが仮想的な'/'になって、これより上に移動できないので、別のコンソールを開いて、そちらでファイルの追加等を行います。(この別のコンソールをzshと表記します)


既存のシステム上のディレクトリを母艦と表記します。





chrootの方と通常のシェルを間違って作業すると大変なことになります。


移動するごとにpwd,ls等で現在位置を確認してください。





●いじったところ


1.不要なアプリの削除


 通常と同じようにpkgtoolを利用して削除できる。


 この時に/dev/nullがないとエラーが出ますので。/devディレクトリを作って、その中に母艦から/dev/nullをコピーしておきます。






zsh


#mkdir /root/work/plamo/dev


#cp -a /dev/null /root/work/plamo/dev (aオプションを忘れない)






2.追加のアプリをインストール


 これも通常と同じようにinstallpkgを利用できる。


 このとき/tmpがないとエラーが出ますのでbashの方で作っておきます。(作らなくてもいけそうです)


 アプリを/usr/local以下に入れるのが主流だと思うんですが、/usr/local以下は存在しません。ので、/usr以下に入れて逃げました。


(自分メモ)


 vim,fluxbox,fluxconf,mpg123


変更等がおわったら、先程作った/tmp,/devディレクトリを削除し、chrootを終了しておきます。exitで終了できます。





3.ホームに置く設定ファイルの追加、変更


 追加したアプリや独自の設定があるアプリの設定ファイルを追加、変更しました。


 zshで、母艦のホームディレクトリからファイルを持ってきたり、bashで普通に編集したりします。


(自分メモ)


/home-----.fluxbox,.w3m,.zshrc,.vimrc,.gvimrc,.mozilla


/usr/sbin-viをrename、vimのシンボルリンクをviでつくる。





4.initrd.gzの変更


 起動したときにram上に展開される、つまり書き込みが可能になる部分は、このinitrd.gzの中に入ってるので、これを展開、マウントして、必要な部分を変更する。


 



zsh


#cd /root/work/plamo/isolinux


#cp initrd.gz ../../


#cd ../../


#ls


initrd.gz plamo/


#gzip -d initrd.gz


#mount -o loop initrd /mnt






これで、initrd.gzが/mntにマウントされ編集可能になります。


ここでは、/etc,/rootで編集が必要な設定ファイルを変更しました。


(自分メモ)


/etc-----hosts,network.conf,passwd(シェルの変更)


/root----.bashrc





変更が終わったらinitrdをアンマウント、圧縮する。






zsh


#umount /mnt


#cd /root/work 


#gzip -9 initrd


#ls


initrd.gz






5.isoイメージを作る


 コピーしたinitrd.gzをもとに戻し、isolinuxディレクトリは、圧縮しないので、ひとつ上にコピーします。


 その後、圧縮して、isoイメージをつくります。






zsh


#cd /root/work/


#ls


initrd.gz plamo/


#mv initrd.gz plamo/isolinux


#cp -ar plamo/isolinux .


#ls


isolinux/ plamo/


#mkzftree plamo/ plamo_cus  (plamoディレクトリを圧縮しplamo_cusを作る


#cp -ar isolinux plamo_cus (isolinuxディレクトリをもどす)


#mkisofs -v -J -R -z -b isolinux/isolinux.bin -c isolinux/boot.cat \


-no-emul-boot -boot-load-size 4 -boot-info-table \


-V CDplamo_cus -o cdplamo_cus.iso plamo_cus


(ブート可能なisoイメージをつくる)


 #ls


cdplamo_cus.iso plamo/ plamo_cus/






完成です!!





ここまで、一週間かかりました。。。





2007年9月16日日曜日

VMware PlayerでCD-Plamoを起動してみる。









参考になるページ


本当に無償で使える「VMware Player」


SynHack(リンクが上手く張れないのでVM/VMware Playerの項目を探してください)








1.VMware Playerをダウンロード


VMwareのダウンロードページ


普通のアプリケーションと同じ様にインストール可能。





2.QEMUをダウンロード


武田俊也さんのページ


アーカイブを解凍する。





3.CD Plamoのisoイメージをダウンロードする。





4.コマンドプロンプトでqemu-img.exeを実行する。


>qemu-img.exe create -f vmdk C:\VMware\plamo\cdplamo.vmdk 10G


vmdkというVMware形式のイメージを作成します。


10Gとサイズを指定していますが、10Gのファイルができるわけではないので、大きめにつくります。





5.plamo.vmxという名前の設定ファイルを作ります。


参考になるページ1にあったのをそのままコピーさせてもらいました。



virtualHW.version = "3"


memsize = "256"


ide0:0.present = "TRUE"


ide0:0.fileName = "filename.vmdk"


ide1:0.present = "TRUE"


ide1:0.fileName = "auto detect"


ide1:0.deviceType = "cdrom-raw"


floppy0.fileName = "A:"


ethernet0.present = "TRUE"


ethernet0.connectionType = "nat"


usb.present = "TRUE"


sound.present = "TRUE"


sound.virtualDev = "es1371"


displayName = "Fedora Core4"


guestOS = "other26xlinux"


nvram = "filename.nvram"


scsi0:0.redo = ""


ethernet0.addressType = "generated"


uuid.location = "56 4d 4a 15 2a 3f 49 70-03 c9 82 f3 02 82 dc 4c"


uuid.bios = "56 4d 4a 15 2a 3f 49 70-03 c9 82 f3 02 82 dc 4c"


ide1:0.autodetect = "TRUE"


ethernet0.generatedAddress = "00:0c:29:82:dc:4c"


ethernet0.generatedAddressOffset = "0"


checkpoint.vmState = "filename.vmss"


tools.remindInstall = "TRUE"


ide0:0.redo = ""






以下の部分を変更しました。



ide0:0.fileName = "cdplamo.vmdk" 先ほど作ったイメージファイル名を指定


ide1:0.fileName = "cdplamo-1.37.iso" CD Plamoのイソイメージファイル名を指定


ide1:0.deviceType = "cdrom-image"


displayName = "CDPlamo" 適当な名前


nvram = "cdplamo.nvram" 適当にvmdkのファイル名に合わせておきました


checkpoint.vmState = "cdplamo.vmss" 適当にvmdkのファイル名に合わせておきました






6.vmxファイルを実行するとVMware Playerが立ち上がって、CD Plamoが起動します。





マシンがしょぼいのかすごく重かったです。メモリ1.5Gも積んでるのに、まだ少ないのかなぁ







Vector - Website Explorer


Webサイトを階層的に表示してくれる。保存したりもできるみたい。


後でつかってみる。


どなたかの日記で紹介されていました。





2007年9月9日日曜日

UDP版echoサーバ







#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>


#define MAX 255

void exitWithError(char *message);


int main(int argc,char *argv[])
{
int sock;
struct sockaddr_in echoServAddr;
struct sockaddr_in echoCliAddr;
unsigned int cliAddrLen;
char echoBuffer[MAX];
unsigned short echoServPort;
int recvMsgSize;


if(argc != 2){
fprintf(stderr,"Usage %s <Port>\n,argv[0]");
exit (1);
}

echoServPort = atoi(argv[1]);


if((sock = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0)
exitWithError("socket() error\n");


memset(&echoServAddr,0,sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
echoServAddr.sin_port = htons(echoServPort);


if(bind(sock,(struct sockaddr *)&echoServAddr,sizeof(echoServAddr)) < 0)
exitWithError("bind() error\n");


for(;;)
{
cliAddrLen = sizeof(echoCliAddr);

if((recvMsgSize = recvfrom(sock,echoBuffer,MAX,0,(struct sockaddr *)&echoCliAddr,&cliAddrLen)) < 0)
exitWithError("recvfrom() error\n");


printf("Handling: %s\n",inet_ntoa(echoCliAddr.sin_addr));

if(sendto(sock,echoBuffer,recvMsgSize,0,(struct sockaddr *)&echoCliAddr,sizeof(echoCliAddr)) != recvMsgSize)
exitWithError("sendto() bytes error\n");

}

}

void exitWithError(char *message)
{
printf("%s\n",message);
exit(1);
}





2007年9月7日金曜日

UDP版echoクライアント







#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#define MAX 255

void exitWithError(char *message);

int main(int argc,char *argv[])
{
int sock;
struct sockaddr_in servAddr;
struct sockaddr_in fromAddr;
unsigned short servPort;
unsigned int fromSize;
char *echoString;
char *servIP;
char echoBuffer[MAX+1];
int echoStringLen;
int recvStringLen;



if(argc < 3){
fprintf(stderr,"Usage: %s <ServIP> <Word> [<Serv Port>]\n",argv[0]);
exit (1);
}

echoString = argv[2];
servIP = argv[1];


if((echoStringLen = strlen(echoString)) > MAX)
exitWithError("word is too long\n");


if(argc == 4)
servPort = atoi(argv[3]);
else
servPort = 7;


if((sock = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0)
exitWithError("sockt() error\n");

memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(servIP);
servAddr.sin_port = htons(servPort);


if(sendto(sock,echoString,echoStringLen,0,(struct sockaddr *) &servAddr,sizeof(servAddr)) != echoStringLen)
exitWithError("sendto() error\n");


fromSize = sizeof(fromAddr);


if((recvStringLen = recvfrom(sock,echoBuffer,MAX,0,(struct sockaddr *) &fromAddr,&fromSize)) != echoStringLen)
exitWithError("recvfrom() error\n");


if(servAddr.sin_addr.s_addr != fromAddr.sin_addr.s_addr)
{
fprintf(stderr,"recv from unkown host\n");
exit (1);
}

echoBuffer[recvStringLen] = '\0';
printf("Received: %s\n",echoBuffer);

close(sock);

return 0;
}

void exitWithError(char *message)
{
printf("%s\n",message);
exit (1);
}



コンパイルも通って実行もできるのに、なぜかエコーされてこないと思ったら


udpのエコーサーバが動いてませんでした。。。。


それで1時間ぐらい悩んでしまいました。





2007年9月4日火曜日

daytimeクライアント




#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>


#define RCVSIZE 1024

void exitError(char *message);


int main(int argc,char *argv[])
{
int sock;
char buffer[RCVSIZE];
char *servIP;
struct sockaddr_in sockaddr;
int bytes=0;

if(argc < 1)
{
fprintf(stderr,"Usage %s <servIP>\n",argv[0]);
exit (1);
}


servIP = argv[1];


if((sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
exitError("socket() error\n");


memset(&sockaddr,0,sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = inet_addr(servIP);
sockaddr.sin_port = htons(13);


if(connect(sock,(struct sockaddr *) &sockaddr,sizeof(sockaddr)) < 0)
exitError("connect error\n");

while(recv(sock,buffer,RCVSIZE,0) >= 1)
{
printf("%s",buffer);
}

close(sock);
}


void exitError(char *message)
{
printf("%s\n",message);
exit (1);
}





2007年9月3日月曜日

これまでのまとめ






クライアントの方は、



  • 1.socket()でソケットを作成する。

  • 2.connect()でサーバへ接続する。

  • 3.send()で送信、recv()で受信する。

  • 4.close()で接続を切断し、ソケットを破棄する。



サーバの方は、



  • 1.socket()でソケットを作成する。

  • 2.bind()でソケットにポート番号を割り当てる。

  • 3.listen()でソケットを接続待ちにする。

  • 4.accept()を呼び出してソケットを新しくつくる。

  • 5.recv()で受信、send()で送信する。

  • 6.close()で接続を切断、新しく作ったソケットを破棄する。






ソケット関連の関数のメモ3



CPUのバイトオーダの関係で送受信したバイトの順序がおかしくなるので、


送信する順序を統一する必要がある。そのために、送信前に変換する。





long int htonl(long int hostLong)


short int htons(short int hostShort)


ホストのバイトオーダからネットワークバイトオーダに変換する。





long int ntohl(long int netLong)


short int ntohs(short int netShort)


ホストのバイトオーダからネットワークバイトオーダに変換する。





2007年8月31日金曜日

echoサーバ




#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#define MAX 5
#define RCVSIZE 32

void errorExit(char *message);
void Handling(int clntSocket);


int main(int argc,char *argv[])
{
int servSocket;
int clntSocket;
struct sockaddr_in echoServAddr;
struct sockaddr_in echoClntAddr;
unsigned short echoServPort;
unsigned int clntLen;

if(argc != 2){
fprintf(stderr,"Usage: %s <Port>\n",argv[0]);
exit(1);
}

echoServPort = atoi(argv[1]);

if((servSocket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
errorExit("socket error\n");

memset(&echoServAddr,0,sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
echoServAddr.sin_port = htons(echoServPort);

if(bind(servSocket,(struct sockaddr *) &echoServAddr,sizeof(echoServAddr)) < 0)
errorExit("bind error\n");

if(listen(servSocket,MAX) < 0)
errorExit("listen error\n");

for(;;){

clntLen = sizeof(echoClntAddr);

if((clntSocket = accept(servSocket,(struct sockaddr *) &echoClntAddr,&clntLen)) < 0)
errorExit("accept error\n");

printf("Handling client %s\n",inet_ntoa(echoClntAddr.sin_addr));

Handling(clntSocket);
}


}

void Handling(int clntSocket)
{
char echoBuffer[RCVSIZE];
int recvMesSize;


if((recvMesSize = recv(clntSocket,echoBuffer,RCVSIZE,0)) < 0)
errorExit("recv error\n");

while(recvMesSize > 0)
{
if(send(clntSocket,echoBuffer,recvMesSize,0) != recvMesSize)
errorExit("send error\n");

if((recvMesSize = recv(clntSocket,echoBuffer,RCVSIZE,0)) < 0)
errorExit("recv error\n");
}

close(clntSocket);
}



関数名、変数名を付けるセンスがないって気づいてしまった。。。。





socket関連の関数のメモ2



manページ書き写してるだけなんで気にしないでください。






  • man 2 bind


int bind(int sockfd,const struct *sockaddr,socklen_t addr_len)


サーバのソケットにローカルのアドレス等を割り当てる


sockfd


ソケットのディスクリプタ


*sockaddr


サーバのアドレス、ポート、アドレスファミリの構造体



addr_len


構造体のサイズ


戻り値は成功時に0、それ以外は-1







  • man 2 listen


int listen(int sockfd,int backlog)


ソケットを接続待ちの状態にする


sockfd


ソケットのディスクリプタ


backlog


同時接続最大数


戻り値は成功時に0、それ以外は-1












  • man 2 accept


int accept(int sockfd,struct *sockaddr,socklen_t *addrlen)


ソケットへの接続を受け付ける


sockfd


ソケットのディスクリプタ


*sockaddr


クライアントのアドレスが入る


*addrlen


sockaddrのサイズが入る


戻り値はアドレスのサイズ(バイト単位)









  • inet_ntoa()


ドット10進数のIPアドレスを32bit2進数に変換する。






  • inet_addr()


32bit2進数表記のIPアドレスをドット10進数に変換する。





subversionのインストール



Plamoのcontribには、subversionのパッケージがあるんだけど、実行するとlibaprutil-0.so.0が見つからないって怒られます。


libaprutilを調べてみるとapache関係みたいで、apacheを入れないといけないみたい。


subversionを入れたいだけなのに、apachまで入れるのは、ちょっと。。。。


ってことで、libaprとlibaprutilをmakeして入れました。



  • 1.apr.apacheからダウンローする。1.*系列と0.*系列があるけれど、plamoでは0.*系列の方が必要

  • 2.それぞれ解凍して./configure && make && make install でOK


でも、subversion入れるのにapacheが必要って普通なの?それとも探し方が悪かっただけで、本当は別のパッケージがあったのかな?





2007年8月29日水曜日

socket関連の関数のメモ







  • man 2 socket


int socket(int domain,int type,int protocol)


ソケットを作って、そのソケットのディスクリプタを返す。


domain


プロトコルファミリの指定


PF_INET IPv4


PF_INET6 IPv6


などがある。とりあえず今のところは、PF_INETしか使わないと思う。


type


通信方法の指定


SOCK_STREAM


SOCK_DGRAM


などがある。色々とあるが、とりあえずこの2つしか使わないと思う。





protocol


そのソケットが利用するプロトコルを指定する。


戻り値は、ソケットのディスクリプタ、エラーの場合には-1









  • man 2 connect


int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addr_len)


ディスクリプタsockfdが参照するソケットを*serv_addrのアドレスに接続する。


sockfd


接続するソケットのディスクリプタ





*serv_addr


接続先のIPアドレス、ポート番号等を指定する。





addr


serv_addrのサイズを指定する。


socketlen_tとなっているが実際にはint。


戻り値


成功時は、0。失敗したときは、-1









  • man 2 send


ssize_t send(int s,const void *buf,size_t len,int flags)


ソケットにメッセージを送る。


s


ソケットのディスクリプタ


*buf


送信したいメッセージのポインタ


len


送信したいメッセージのサイズ


flags


send()が呼び出されたときのプログラムの振舞を決める。


man を読んでも良く理解できない。0でデフォルトになる。


戻り値


成功時は、送信したメッセージのサイズ。失敗したときは、-1







  • man 3 recv


ssize_t recv(int s,void *buf,size_t len,int flags)


s


ソケットのディスクリプタ


*buf


受信したメッセージを入れるバッファ


len


バッファのサイズ


flags


recv()が呼び出されたときのプログラムの振舞を決める。


man を読んでも良く理解できない。0でデフォルトになる。



戻り値


成功時は、受信したメッセージのサイズ。失敗したときは-1





echoクライアント




#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#define RBUFFER 1024

void ExitError(char *message);

int main(int argc,char *argv[])
{
int sock;
struct sockaddr_in echoServAddr;
unsigned short echoServPort;
char *ServIP;
char *echoString;
char echoBuffer[RBUFFER];
unsigned int echoStringLen;
int byteRec;
int byteTotal;


if(argc < 3){
fprintf(stderr,"Usage %s <ServIP> <Word>\n",argv[0]);
exit(1);
}

ServIP = argv[1];
echoString = argv[2];
echoServPort = 7;

printf("send =%s\n",echoString);


if ((sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
ExitError("Error socket");

memset(&echoServAddr,0,sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = inet_addr(ServIP);
echoServAddr.sin_port = htons(echoServPort);


if(connect(sock,(struct sockaddr *) &echoServAddr,sizeof(echoServAddr)) < 0)
ExitError("Fail connect");

echoStringLen = strlen(echoString);


if(send(sock,echoString,echoStringLen,0) != echoStringLen)
ExitError("Fail send");

byteTotal = 0;
printf("Received=");

while(byteTotal != echoStringLen){
if((byteRec = recv(sock,echoBuffer,RBUFFER-1,0)) <= 0)

ExitError("recievesize error");

byteTotal += byteRec;
echoBuffer[byteRec] = '\0';
printf(echoBuffer);
}

printf("\n");

close(sock);

return 0;

}

void ExitError(char *message)
{
perror(message);
exit (1);
}





2007年8月28日火曜日

TCP/IPソケットプログラミングC言語編



ISBN:4274065197「TCP/IPソケットプログラミング」


知り合いに聞いたところ、薄くて読みやすい、必要な事は書いてあるとのことだったので、買ってみました。


たしかに薄めで、読みやすそうでした。


はてなダイアリーで検索してみても、よい評価をしている人が多かったので、間違ってなかったみたい。





2007年8月26日日曜日

PlamoLinuxでWLI-CB-AMG54HPを使う(ndiswrapper)



WLI-CB-AMG54HPっていう無線LANカードを中古で安く買ったんですが、カーネル標準のbcm43xxてドライバでは動かないようなので、ndiswrapperを使ってWinドライバで使うことにしました。





参考になるwebページ


1.かってにLinux20


2.LinuxでWindows用無線LANドライバを利用するには


3.中古ノート+Plamo Linux で無線LAN





事前にカーネルのソースをインストールしておく必要があります。





1.まず、buffaloのページからWin用のドライバをダウンロードします。


参考ページ1によると、8.52でもいけるそうですが、8.30でやっておきました。





2.次にndiswrapperのページからリンクをたどって、ダウンロードし、インストールします。



tar xzf ndiswrapper-1.47.tar.gz
cd ndiswrapper-1.47
make
su
make install

3.Win用のドライバを解凍します。



lha e wdrv_830.exe

4.ndiswrapperを使ってドライバをインストールします。



cd wdrv_830/CBG54/WIN2000
ndiswrapper -i netg54s.inf ドライバのインストール
ndiswrapper -l 確認
netg54s : driver installed
device (*****) present カードが刺さっていると表示される
ndiswrapper -m いろいろ設定してくれる




5./etc/ndiswrapper/netg54s/bwcdrv.sysを削除する。


良く分からないんですが、削除しとかないと動かないようです。





6.ndiswrapperをロードする。



modprobe ndiswrapper 上手くいけば、ここでカードのランプ点灯する。

自分の環境では、wlan0として認識しました。


はじめてだったので、/etc/network.mode、/etc/network.confなんかを設定しましあた


後は、iwconfig で設定して完了です。


/etc/network.mode



wlan0 -d

/etc/network.conf



wlan0,default,*)
INFO="wlan0 default"
DHCP=y
PPPOE=n
GATEWAY=+
DNS=+
;;

既存のものをコピーして、デバイスの名前の部分だけを変更しました。


wepキーなどを自動的に設定させるときには、/etc/wireless.confを設定してください。


設定方法は、参考ページの3が分かりやすいです。








速度測定してみてところ、6倍ぐらいの速度が出ていてびっくりしました。


買ってよかった!