TCP通信プログラム
サーバー側とクライアント側でそれぞれ作りました。
ほんとお粗末なソースコードですが載せておくので、質問訂正等あればコメントか
palloc.mknet10(at)gmail.com
までメール飛ばしてください。
※私も勉強中のため、質問されてもわからないかもしれません、許してorz
〜サーバ側ソースコード〜
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
int main(void){
int sock0;
struct sockaddr_in addr;
struct sockaddr_in client;
int len;
const char *str;
int sock;
sock0=socket(AF_INET,SOCK_STREAM,0);//socketの作成
//error check
if(sock0<0){
perror("sock0:");
return -1;
}
addr.sin_family=AF_INET;//プロトコルファミリ(TCPを設定)
addr.sin_port=htons(12345);//port number
addr.sin_addr.s_addr=INADDR_ANY;//IP Adress(特に指定しない)
bind(sock0,(struct sockaddr *)&addr,sizeof(addr));//ソケットの返り値(ディスクリプタ)、socketの先頭アドレス、socketの大きさ
listen(sock0,5);//待ち受け状態にする(ソケットバッファのキューを作成する)
while(1){
len=sizeof(client);
sock=accept(sock0,(struct sockaddr *)&client,&len);
write(sock,"what's up!?",sizeof("what's up!?"));
close(sock);
}
fclose(f);
close(sock0);
return 0;
}
〜クライアント側ソースコード〜
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int sock;
struct sockaddr_in server;
char buf[32];//受け取る文字列
int n;//返ってきたサイズの大きさ
sock=socket(AF_INET,SOCK_STREAM,0);//socket作成
server.sin_family=AF_INET;//TCPを設定
server.sin_port=htons(12345);//port number
server.sin_addr.s_addr=inet_addr("127.0.0.1");//IPAdress(今は自分に設定)
connect(sock,(struct sockaddr *)&server,sizeof(server));//サーバーに接続
memset(buf,0,sizeof(buf));//配列の初期化
n=read(sock,buf,sizeof(buf));
printf("%d,%s\n",n,buf);
close(sock);
return 0;
}
簡単に説明すると、クライアントから接続がきたら"what's up!?"という文字列を返すプログラムです。
クライアント側で最後に
↑で設定しているポート番号はサーバのポート番号で、クライアント側のポート番号ではありません。
ちなみにクライアント側で通信先のIPアドレスを127.0.0.1としていて、これはNICに元々設定されてる自分を示すアドレスです。
ここで使っている関数のリファレンスのようなものを作って次回載せたいと思います。しばしお待ちを・・・
ほんとお粗末なソースコードですが載せておくので、質問訂正等あればコメントか
palloc.mknet10(at)gmail.com
までメール飛ばしてください。
※私も勉強中のため、質問されてもわからないかもしれません、許してorz
〜サーバ側ソースコード〜
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
int main(void){
int sock0;
struct sockaddr_in addr;
struct sockaddr_in client;
int len;
const char *str;
int sock;
sock0=socket(AF_INET,SOCK_STREAM,0);//socketの作成
//error check
if(sock0<0){
perror("sock0:");
return -1;
}
addr.sin_family=AF_INET;//プロトコルファミリ(TCPを設定)
addr.sin_port=htons(12345);//port number
addr.sin_addr.s_addr=INADDR_ANY;//IP Adress(特に指定しない)
bind(sock0,(struct sockaddr *)&addr,sizeof(addr));//ソケットの返り値(ディスクリプタ)、socketの先頭アドレス、socketの大きさ
listen(sock0,5);//待ち受け状態にする(ソケットバッファのキューを作成する)
while(1){
len=sizeof(client);
sock=accept(sock0,(struct sockaddr *)&client,&len);
write(sock,"what's up!?",sizeof("what's up!?"));
close(sock);
}
fclose(f);
close(sock0);
return 0;
}
〜クライアント側ソースコード〜
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int sock;
struct sockaddr_in server;
char buf[32];//受け取る文字列
int n;//返ってきたサイズの大きさ
sock=socket(AF_INET,SOCK_STREAM,0);//socket作成
server.sin_family=AF_INET;//TCPを設定
server.sin_port=htons(12345);//port number
server.sin_addr.s_addr=inet_addr("127.0.0.1");//IPAdress(今は自分に設定)
connect(sock,(struct sockaddr *)&server,sizeof(server));//サーバーに接続
memset(buf,0,sizeof(buf));//配列の初期化
n=read(sock,buf,sizeof(buf));
printf("%d,%s\n",n,buf);
close(sock);
return 0;
}
簡単に説明すると、クライアントから接続がきたら"what's up!?"という文字列を返すプログラムです。
クライアント側で最後に
↑で設定しているポート番号はサーバのポート番号で、クライアント側のポート番号ではありません。
ちなみにクライアント側で通信先のIPアドレスを127.0.0.1としていて、これはNICに元々設定されてる自分を示すアドレスです。
ここで使っている関数のリファレンスのようなものを作って次回載せたいと思います。しばしお待ちを・・・