recvfrom関数の戻り値がおかしいんですが…
初めて投稿させていただきます。
現在、Cにてあるクライアントプログラムを作成している者です。
構成は以下の通り。
《構成》
サーバ:PLC(シーケンサと書けば大体の方はわかりますか?)
クライアント:Linux Ubuntu9.10
通信方式:TCP/IP
《開発環境》
言語:C
IDE:eclipse
コンパイラ:gcc 4.x
《質問》
クライアントプログラムからASCIIデータをサーバへ送信し、サーバはクライアントから受信したASCIIデータに応答し、ASCIIデータ伝文を返信してきます。
このサーバからのASCIIデータ応答伝文をrecvfrom関数で受信し、応答伝文のASCIIデータを'buf'変数に格納し、標準出力関数で表示させるといったプログラムです。
このプログラムでは、ユーザ関数内でrecvfrom関数をコールしているのですが、ユーザ関数内でrecvfrom関数をコールした場合、受信データの先頭4byteしか受信できておらず、困っています。
ちなみに、main関数内でrecvfrom関数をコールすると、応答伝文全体のデータをきちんと受信できています。
ちなみに、サーバの応答ASCIIデータ伝文は、仕様通り(期待通り)のデータが返信されています。(ネットワークモニタ:wiresharkで確認済み)
recvfrom関数をコールする場所によって、変数に格納するデータ量が変わるといったことがあるのでしょうか。
ソースの一部を添付します。
参照の上、アドバイス等いただけないでしょうか。
《ソース》
◆mainソース
#include ...
:<-#include定義
int main{
:<-変数定義、変数初期値代入処理等
ユーザ関数1()コール<-ユーザ関数1内でソケット通信処理を動作させている。
ユーザ関数2()コール<-同上
}
◆ユーザ関数用ソース
#include...
:<-#include定義
unsigned char ユーザ関数名1;<-ユーザ関数プロトタイプ宣言
unsigned char ユーザ関数名2:<-同上
char 変数1[5];
char s_buf[4096];
char buf[4096]; /*データ受信用バッファ*/
char 変数2[256];
size_t len;
long l;
int sock_fd; /*ソケット用ファイル記述子*/
struct sockaddr_in cl_addr; /*CPU用ソケットアドレス*/
socklen_t cl_len = 0; /*cl_addrのサイズ格納用*/
ssize_t n = 0;
unsigned char ユーザ関数1(char *引数1,…char *引数5){
:送信データ生成処理
//* ソケット作成 *//
if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
return 1;
}
//* 接続先定義*//
memset(&cl_addr, 0, sizeof cl_addr);
cl_addr.sin_family = AF_INET; /*プロトコル定義*/
cl_addr.sin_addr.s_addr = inet_addr("***.***.***.***"); /*IPアドレス定義*/
cl_addr.sin_port = htons(****); /*Port定義*/
//* 接続 *//
if (connect(sock_fd, (struct sockaddr *)&cl_addr, sizeof cl_addr) < 0) {
perror("connect");
return 1;
}
//* データ送信 *//
if(send(sock_fd, s_buf, strlen(s_buf), 0) < 0){
fprintf(stderr, "could not send message : %s\n", s_buf);
exit(EXIT_FAILURE);
}
printf("\nSendMessage\n%s\n",s_buf);
//* データ受信 *//
cl_len = sizeof cl_addr;
//*↓↓このrecvfrom関数でbuf内にサーバ応答伝文の先頭4byteのみが格納されている。↓↓*//
if (( n = recvfrom(sock_fd, buf, sizeof buf,0, (struct sockaddr *)&cl_addr, &cl_len)) < 0) {
perror("recvfrom");
return 1;
}
fprintf(stderr ,"TCP from addr = %s, port = %d\n",
inet_ntoa(cl_addr.sin_addr),
ntohs(cl_addr.sin_port)
);
お礼
redfox63さま、アドバイスありがとうございます。参考にさせていただきます。