TCP/IP通信を実装したプログラム
受付中
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,077
c言語で通信を行うのを勉強し始めたのですが作成したプログラムがうまく動作しません。
下記は入力した小文字を大文字にして返すプログラムをTCP/IPで行うように作成しました。
linux上で行ってポート番号は9000、IPはループバックアドレスにしてます。
//サーバ側
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <arpa/inet.h>
#define SOCK_NAME "./socket"
int main()
{
int i;
int fd1, fd2;
struct sockaddr_in saddr;
struct sockaddr_in caddr;
int len;
int ret;
char buf[1024];
if ( ( fd1 = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
perror( "socket" );
exit( 1 );
}
memset( (char *)&saddr, 0, sizeof( saddr ) );
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr=INADDR_ANY;
saddr.sin_port=htons(9000);
strcpy( saddr.sin_port, SOCK_NAME );
unlink( SOCK_NAME );
if ( bind( fd1, ( struct sockaddr * )&saddr, ( socklen_t )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, ( socklen_t * ) &len ) ) < 0 ) {
perror( "accept" );
exit( 1 );
}
fprintf( stderr, "Connection established: socket %d used.\n", fd2 );
while( ( ret = read( fd2, buf, 1024 ) ) > 0 ) {
fprintf( stderr, "read: %s\n", buf );
for ( i=0; i<ret; i++ )
if ( isalpha( buf[i] ) )
buf[i] = toupper( buf[i] );
fprintf( stderr, "write: %s\n", buf );
write( fd2, buf, strlen( buf )+1 );
fsync( fd2 );
}
close( fd2 );
}
close( fd1 );
return 0;
}
//クライアント側
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <arpa/inet.h>
#define SOCK_NAME "./socket"
int main()
{
struct sockaddr_in saddr;
struct in_addr sin_addr;
int soc;
char buf[1024];
if ( ( soc = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
perror( "socket" );
exit( 1 );
}
memset( (char *)&saddr, 0, sizeof( saddr ) );
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
saddr.sin_port=htons(9000);
strcpy( saddr.sun_path, SOCK_NAME );
if ( connect( soc, ( struct sockaddr * )&saddr, ( socklen_t )sizeof( saddr ) ) < 0 ) {
perror( "connect" );
exit( 1 );
}
fprintf( stderr, "Connection established: socket %d used.\n", soc );
while( fgets( buf, 1024, stdin ) ) {
if ( buf[strlen(buf)-1] == '\n' ) buf[strlen(buf)-1] = '\0';
write( soc, buf, strlen( buf )+1 );
fsync( soc );
read( soc, buf, 1024 );
fprintf( stdout, "%s\n", buf );
}
close( soc );
return 0;
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
「情報の追加」に書かれている
strcpyでエラーがでるのは
sin_portはuint16型なので"./socket"の文字列をコピーするだけの容量がありません。
また通常のTCP/IPプログラムなら
sin_portにはポート番号を入れるだけでいいのでstrcpyはやらなくていいと思います
ここを参考にされるとうまく行くと思います
http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
ElecDove
2017/07/10 22:24
うまく動作しない,ではなくどのように動作しないのか書いたほうがいいですよ.たとえば接続が確立しない,とか.
astars
2017/07/10 22:49
サーバ側のsocketとbindの間にあるstrcpy( saddr.sin_port, SOCK_NAME );でエラーが発生してしまいます。
yohhoy
2017/07/11 00:26
sun_pathやSOCK_NAMEは何のために利用しているのでしょう?TCP/IPソケットとUNIXドメインソケットを混同しているようです。