socket通信についてです。

クライアント側
・socketでソケットを作る
・sockaddr_inソケット構造体に情報を格納する
・connectでサーバーに接続する
・ソケットを使って読み書き
サーバー側
・socketでソケットAを作る
・sockaddr_inソケットA構造体に情報を格納する
・bindでこの二つを結びつける
・listenでソケットAを使ってクライアントからの接続を受け付ける
 (ここでクライアントのconnectを聴く)
・acceptでクライアントに読み書き用のソケットBを作る
・ソケットBを使って読み書き

こういう流れでプログラムを書いてみました。
書いている段階で疑問に思ったことは
・クライアント側でbindする必要はないのか?
・1つのソケットで読み書きできるのか?出来ない場合はクライアント側も読みと書きに2つソケットが必要?
・サーバー側のソケットAはクライアントからの要求を聞くためで、ソケットBで読み or 書きをするのか?
など分かりませんでした。調べてみたりしたのですがはっきりとした回答を得られなかったのでここで質問させていただきました。

クライアント
http://ideone.com/HEAmjU
サーバー
http://ideone.com/rogkwj

コンパイルエラーは出なかったですが、ローカル環境でうまく通信できませんでした。