学校にてUNIXを用いてのソケットプログラミングをゼロから学んでいます。
自宅で課題をやろうと思いwindowsPCにvirtualboxを導入しようとしたところ、何か間違っているようで成功しませんでした。
そこで、こちらに質問し、添削をして頂こうと考えました。
課題にそって、手探りながらもソースを組んでみたため、添削をお願いします。
課題内容
・クライアント、サーバを作り、クライアントで入力した小文字をサーバに送り、サーバが大文字に変換、その大文字をクライアントに送り返す。
補足
・終了条件を付けるなどの支持は一切なし。
クライアント側
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#define SOCK_NAME "./socket"
/*argv[1]はIPアドレス, argv[2]はポート番号*/
int main(int argc, char *argv[])
{
struct sockaddr_in saddr;
int soc;
char buf[1024];
char *sIP;
int sPort;
sIP = argv[1]; //サーバのIPアドレスを取得
sPort = atoi(argv[2]); //ポート番号を取得
/*ソケット作成*/
if ( (soc = socket(AF_INET, SOCK_STREAM, 0) ) < 0 )
{
perror("socket");
exit(1);
}
memset((char *)&saddr, 0, sizeof(saddr)); //saddrを0で埋める
saddr.sin_family = AF_INET; //アドレスファミリ
saddr.sin_addr.s_addr = inet_addr(sIP); //サーバのIPアドレス
saddr.sin_port = htons(sPort); //サーバのポート番号
/*接続*/
if( connect(soc, (struct sockaddr *)&saddr, sizeof(saddr) ) < 0)
{
perror("connect");
exit(1);
}
/*小文字→大文字に変換*/
printf("小文字を入力して下さい\n");
while( fgets(buf, 1024, stdin) ) //キーボードから文字入力
{
write(soc, buf, 1024);
read(soc, buf, 1024);
printf("大文字に変換します\n%s\n\n", buf);
printf("小文字を入力して下さい\n");
}
close(soc);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SOCK_NAME "./socket"
/*argv[1]はポート番号*/
int main(int argc, char *argv[])
{
int i;
int fd1, fd2;//ソケット
struct sockaddr_in saddr;
struct sockaddr_in caddr;
int sPort;
int len;//クライアントのアドレス構造体の長さ
int ret;//大文字変換の時に使用
char buf[1024];
sPort = atoi(argv[1]); //ポート番号を取得
/*ソケット作成*/
if( (fd1 =socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("socket");
exit(1);
}
memset((char *)&saddr, 0, sizeof(saddr)); //構造体を0で埋める
saddr.sin_family = AF_INET; //アドレスファミリ
saddr.sin_addr.s_addr = htonl(INADDR_ANY); //ワイルドカードを使用
saddr.sin_port = htons(sPort); //ポート番号
if( bind( fd1, (struct sockaddr *)&saddr, sizeof(saddr) ) < 0)
{
perror("bind");
exit(1);
}
if( listen(fd1,5) < 0 )
{
perror("listen");
exit(1);
}
while(1)
{
len = sizeof(caddr);//入出力パラメータのサイズをセット
if( ( fd2 = accept(fd1, (struct sockaddr *)&caddr, &len) ) < 0)
{
perror("accept");
exit(1);
}
while( (ret = read(fd2, buf, 1024)) > 0 )//retに文字数を格納
{
for (i=0; i < ret; i++)
{
if (isalpha(buf[i])) //文字かどうか判定
{
buf[i] = toupper(buf[i]);
}
}
write(fd2, buf, 1024);
}
close(fd2);
}
close(fd1);
return 0;
}
括弧はキーボードからの入力なのか、プログラム側の出力側なのかを表しています。
クライアント側(実行ファイル名client, 自分のPCのIPアドレス192.168.1.3)
#client 10000 192.168.1.3 (入力)
#小文字を入力して下さい (出力)
#abcdefg (入力)
#大文字に変換します (出力)
#ABCDEFG (出力)
#
#小文字を入力して下さい (出力)
#
となる動作が理想です。
私の組んだソースに間違いや直した方が良い部分はありますでしょうか?
添削よろしくお願いします。