2012-04-28 2 views
0

構造体の一部をクライアントに渡して苦労しました。私は次のプリントステートメントで症例1の状態をテストしました:構造体の一部をtcpサーバーからクライアントに送信しようとしました

printf("%d %s", data[i].course, data[i].Dept); 

これは問題なく動作しました。今私がしようとしているのはソケットを通して送信することです。マイ送信文は次のとおりです。

send(connected, send_data, strlen(send_data), 0); 

今私は、次の文を試した:

send_data = data[i].couurse; 
strcpy(send_data, data[i].course); 
send_data = atoi(data[i].course); 

をして役に立つ知って、どちらも働きました。私は道がなければならないことを知っていて、誰かが私にどのように私を見せることを望んでいる。私はコースと部署を送信する必要があり、この特定のケースで

while(1) { 

     bytes_received = recv(connected, recv_data, BUF, 0); 
     recv_data[bytes_received] = '\0'; 
     switchInput = atoi(recv_data); 

     switch(switchInput) { 

     case 1: 

      fread(data, sizeof(sched_record), MAX_RECORD, filePointer); 
      fclose(filePointer); 
      char send_data[] = "Enter Department Name"; 
      send(connected, send_data, strlen(send_data), 0); 
      bytes_received = recv(connected, recv_data, BUF, 0); 
      recv_data[bytes_received] = '\0'; 
      strcpy(tempDept, recv_data); 
       for (i=0; i<MAX_RECORD; i++){ 
       if ((strcmp(tempDept, data[i].Dept)==0) && tempCourse != data[i].course){ 
         send(connected, &data[i].Dept, sizeof(data[i].Dept), 0); 
         tempCourse = data[i].course; 
         send(connected, &tempCourse, sizeof(tempCourse), 0); 
       } 
      } 

     break; 

int switchInput; 
int i = 0; 
int connected; 
int sock; 
int bytes_received; 
int sin_size; 
int true = 1; 
int tempCourse = 0; 
char send_data[BUF]; 
char recv_data[BUF]; 
char tempDept[5]; 
char tempDay[1]; 
char tempTime[1]; 
FILE *filePointer; 
sched_record data[MAX_RECORD]; 
filePointer = fopen (BINFILE, "rb"); 

と: 私はコードの関連部分が含まれています。これを行うには良い方法がありますか?これはちょっと混乱しているようです。もしそうなら、もっと単純化されたバージョンを私に見せることができますか?

+0

送信の戻り値は何ですか? – octopusgrabbus

+0

@octopusgrabbus私はあなたの質問を理解していません。 –

+0

戻りステータスを送信しますか? – octopusgrabbus

答えて

2

すべての場所でコンパイルエラーが発生しているはずです。

atoiは不要です。

(あなたがtempCourse変数のアドレスを提供し、それがメモリ内のバイトサイズですsendを参照してください。)

tempCourse = data[i].course; 
send(connected, &tempCourse, sizeof(tempCourse), 0); 

:あなたはitoaまたはsprintf

をしたいが、これはあなたが本当に欲しいものかもしれ(あなたは約network byte orderについて心配する必要があるかもしれませんが)


あなたは文字列に.course構造体のメンバを変換したい場合あるいは、これを試してみてください。

sprintf(send_data, "%d", data[i].course); 
send(connected, send_data, strlen(send_data), 0); 
+0

コンパイルエラーは発生しません。私は-Wallと-wでコンパイルしています。私が読んだことから、itoa()は移植性がなく、ANSI Cの標準ではなく、UNIXのgccで動作しません。これは間違っていますか? –

+0

私はまたどのようにわかりません: send(connected、&send_data、sizeof(send_data)、0); は私を助けます。私がそれを見る方法では、send_dataにコースと部門を割り当てる必要があるので、sendステートメントを使用してその情報を送信できます。それが私に問題を与えているものです。構造体の一部を渡します。 –

+0

投稿した[itoa](http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/)のリンクを見ると、移植性〜> [sprintf](http:// www.cplusplus.com/reference/clibrary/cstdio/sprintf/)。そして、[ここであなたがそれをどのように使うかもしれません](http://ideone.com/Mgd9y)。関心のない、両方のデータを送信するためにsend_data変数を再利用する必要がある理由はありますか? -eg:各呼び出しに2つの異なる変数を使用して送信することもできます。 – violet313