質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

1回答

770閲覧

TCP/IP通信を実装したプログラム

astars

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

0グッド

0クリップ

投稿2017/07/10 11:22

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; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ElecDove

2017/07/10 13:24

うまく動作しない,ではなくどのように動作しないのか書いたほうがいいですよ.たとえば接続が確立しない,とか.
astars

2017/07/10 13:49

サーバ側のsocketとbindの間にあるstrcpy( saddr.sin_port, SOCK_NAME );でエラーが発生してしまいます。
yohhoy

2017/07/10 15:26

sun_pathやSOCK_NAMEは何のために利用しているのでしょう?TCP/IPソケットとUNIXドメインソケットを混同しているようです。
guest

回答1

0

「情報の追加」に書かれている
strcpyでエラーがでるのは
sin_portはuint16型なので"./socket"の文字列をコピーするだけの容量がありません。

また通常のTCP/IPプログラムなら
sin_portにはポート番号を入れるだけでいいのでstrcpyはやらなくていいと思います

ここを参考にされるとうまく行くと思います
http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html

投稿2017/07/10 22:42

DaiGuard

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問