2009-05-28 6 views
2

FILEを使用してUDPからデータを読み取ることができる素敵な抽象化が見つかりました。これはデータの読み込みには効果的ですが、UDP経由でデータを吐き出すためにはうまく動作しません。ここではファイルストリーム上のUDPデータを読み込むためのコードは次のとおりです。CでFILEストリームを使用してソケットに読み書きする

u_int8 *buf; 
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
struct sockaddr_in serverAddr; 
if (sockfd < 0) { 
    printf("Could not open socket\n"); 
    exit(1); 
} 
buf = malloc(BUF_SIZE * sizeof(u_int8)); 
serverAddr.sin_family = AF_INET; 
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
serverAddr.sin_port = htons(port); 
int rc = bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); 
if (rc<0) { 
    printf("Could not bind to port %d\n", port); 
    exit(1); 
} 
/* Make sockfd blocking */ 
int flags = fcntl(sockfd, F_GETFL, 0); 
fcntl(sockfd, F_SETFL, flags & ~O_NONBLOCK); 

FILE *sockfile; 
sockfile = (FILE*)fdopen(sockfd, "r"); 

現在、いくつかの他のコードを呼び出すことができます。

fread(data, sizeof(u_int8), frame_payload_size, sockfile); 

をこれが正常に動作します。他のいくつかのコードが呼び出されます

u_int8 *buf; 
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
struct sockaddr_in clientAddr; 
if (sockfd < 0) { 
    printf("Could not open socket\n"); 
    exit(1); 
} 
memset((char *)&clientAddr, 0, sizeof(clientAddr)); 
buf = malloc(BUF_SIZE * sizeof(u_int8)); 
clientAddr.sin_family = AF_INET; 
clientAddr.sin_port = htons(port); 
if (inet_aton("127.0.0.1", &clientAddr.sin_addr)==0) { 
    printf("inet_aton()\n"); 
    abort(); 
} 
int rc = bind(sockfd, (struct sockaddr *)&clientAddr, sizeof(clientAddr)); 
FILE *sockfile; 
sockfile = (FILE*)fdopen(sockfd, "w"); 

written = fwrite(fm->frame, sizeof(u_int8), fm->frame_length, data_out_stream); 

「を書かれた」書かれた要素の正の数を返す、まだUDPパケットが生成されるように見えるんだろうしかし、その逆はしていないようです。

私は何をしようとしていますか?なぜそれが動作していないかもしれないかについての示唆はありますか?

答えて

1

FILEをフラッシュします。ネットワークパケットは、一杯になったときや強制的にフラッシュするときにのみ生成されます。したがって、1500バイトを超えて(ヘッダフィールドを含むデフォルトの)書き込みを行わない限り、コンピュータは配信を待機します。

1

あなたは情報を隠しているわけではありませんが、他のコードに間違った情報を与えている、つまりソケットがストリームのように振る舞います。私はあなたが読書/書込みのコールに固執する必要があると思うか、またはあなた自身を見つけるでしょうleaky abstraction

1

これは実際にはかなり変です。 fflush()を使用するか、fwrite()の代わりにsend()を使用してFILEを削除してください。 FILEオブジェクトがどのようにバッファされるか、データグラムが順序どおりに到着する/到着することが保証されないというセマンティクスのために予期しない動作に遭遇することになり、メッセージが文字化けする可能性があります。 UNIXソケットを使用している場合を除きます。

関連する問題