weemiee
@weemiee (weemiee)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【C言語】ソケット通信について

Discussion

通信が出来ない

『Tera Term』を使用し、『Raspberry Pi』でのソケット通信を試みました。しかし、実行まではうまくいかず、通信は失敗したようでした。
※ソケット名は次のようにしています。

対象 変数名
ソケット(サーバ) sock_s
ソケット(クライアント) sock_c
接続済のソケット(サーバ) c_sock_s
サーバ
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#define SERVER_PORT 8080
#define BUF_SIZE 1024

void transfer(int tf_sock){
	
	char send_buf[100], recv_buf[100];
	int send_size, recv_size;
	
	recv_size = recv(tf_sock, recv_buf, sizeof(recv_buf), 0);
	if (recv_size == 1) {
		printf("recv error\n");
		exit(1);
	}
	printf("%s\n", recv_buf);
	
}

int main(){
	
	int sock_s = socket(AF_INET, SOCK_STREAM, 0);   //ソケットを作成
	if (sock_s == 1) {
		printf("ソケットエラーです\n");
		return 1;
	}
	
	//IPアドレスやポート番号の指定
	struct sockaddr_in sv_addr;
	sv_addr.sin_family = AF_INET;
	sv_addr.sin_port = htons((unsigned short)SERVER_PORT);
	sv_addr.sin_addr.s_addr = INADDR_ANY;
	memset(&sv_addr, 0, sizeof(struct sockaddr_in));
	
	if ( bind(sock_s, (struct sockaddr *)&sv_addr, sizeof(sv_addr)) == 1 ) {   //ソケット登録
	printf("bind error\n");
		close(sock_s);
		return 1;
	}
	
	if ( listen(sock_s, SOMAXCONN) == 1 ) {   //接続待ち
		printf("listen error\n");
		close(sock_s);
		return 1;
	}
	
	printf("Waiting connect...\n");
	struct sockaddr_in get_addr;
	socklen_t len = sizeof(struct sockaddr_in);
	
	int c_sock_s = accept(sock_s, (struct sockaddr *)&get_addr, &len);   //接続要求の受け付け
	if (c_sock_s == 1) {
		printf("accept error\n");
		close(sock_s);
		return 1;
		
	}
	printf("Connected successfully.\n");
	
	transfer(c_sock_s);   //通信
	
	//クローズ
	close(sock_s);
	close(c_sock_s);
	
}
クライアント
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#define SERVER_PORT 8080
#define BUF_SIZE 1024

void transfer(int tf_sock){
	
	char send_buf[100], recv_buf[100];
	int send_size, recv_size;
	
	printf("Input Message here : ");
	scanf("%s", send_buf);   //サーバーへ送信する文字列を キーボードより読み込む
	
	send_size = send(tf_sock, send_buf, sizeof(send_buf), 0);   //送信
	if (send_size == 1) {
		printf("send error\n");
		exit(1);
	}
	
	recv_size = recv(tf_sock, &recv_buf, sizeof(recv_buf), 0);   //サーバからの応答を受信
	if (recv_size == 1) {
		printf("recv error\n");
		exit(1);
	}
	
}

int main(){
	
	int sock_c = socket(AF_INET, SOCK_STREAM, 0);   //ソケットを作成
	if (sock_c == 1) {
		printf("ソケットエラーです\n");
		return 1;
	}
	
	//IPアドレスやポート番号の指定
	struct sockaddr_in ce_addr;
	ce_addr.sin_family = AF_INET;
	ce_addr.sin_port = htons((unsigned short)SERVER_PORT);
	ce_addr.sin_addr.s_addr = INADDR_ANY;
	memset(&ce_addr, 0, sizeof(struct sockaddr_in));
	
	printf("Start connecting...\n");
	if ( connect(sock_c, (struct sockaddr*)&ce_addr, sizeof(struct sockaddr_in)) == 1 ) {   //サーバーに接続要求送信
		printf("connect error\n");
		close(sock_c);
		return 1;
	}
	printf("Finish connect.\n");
	
	transfer(sock_c);   //通信
	
	close(sock_c);   //クローズ
	
}

サーバとクライアントともに、コンパイルは出来ました。しかし、サーバ側は「Waiting connect...」の表示を最後に動かなくなり、クライアント側は文字列を入力してエンターキーを押したらそのまま終わってしまいました。恐らく、書いたプログラムに不備があるはずだと思っています。
どなたか、お力添え頂けると幸いです。アドバイスあれば是非お願いします。

0

各関数の戻り値をチェックしなおしてください
例えばbind()は-1がエラーです

0Like

@coredumpさん、ご回答ありがとうございます。
個人的に「return 1→異常処理」のイメージが強かったために、間違った考え方をしていました。勉強になります。
ただ、戻り値の修正だけでは、実行結果に変化はありませんでした。やはり最初の質問時と同じ問題が生じてしまいます。何か別のアドバイスは無いでしょうか?

0Like

サーバーもクライアントも、struct sockaddr_in に色々値を設定した後に memset で 0 にリセットしています?

0Like

@nishimuraさん
これです!
memsetを適切な位置に移したら、最後まで実行出来ました。

サーバ
struct sockaddr_in sv_addr;
memset(&sv_addr, 0, sizeof(struct sockaddr_in));

sv_addr.sin_family = AF_INET;
sv_addr.sin_port = htons((unsigned short)SERVER_PORT);
sv_addr.sin_addr.s_addr = INADDR_ANY;
クライアント
struct sockaddr_in ce_addr;
memset(&ce_addr, 0, sizeof(struct sockaddr_in));

ce_addr.sin_family = AF_INET;
ce_addr.sin_port = htons((unsigned short)SERVER_PORT);
ce_addr.sin_addr.s_addr = INADDR_ANY;

アドバイス頂き、ありがとうございました。

0Like

Your answer might help someone💌