2012-01-22 9 views
0

サーバーとクライアント(または親と子)の通信にソケットを使ってacコードを書き込もうとしていますが、私は本当にnoobですこれで私は間違いが続くだけです。私は自分のコードに間違いがたくさんあることを知っていますが、今は "セグメンテーションフォールト"エラーが発生しています。私は要素がお互いを指していないが、それは私の国では遅すぎると知っている、そして、これはすべて私にとって外国語のように思える。 私はあなたが私に提供できる助けを本当に感謝します。 これはすべて、ありがとうございます。ソケットでガイド:2x2配列を乗算するserver-clientプログラム

SERVER.cコード------------------------------------------ -------------------------------------------------- -----

//#include <sys/un.h>  //per utilitzar sockaddr_un 
#include <string.h> 
#include <sys/types.h> 

#include <sys/socket.h> //per utilitzar sockaddr 
#include <unistd.h> 
#define FEMISSOR "multi.socket" // per enviar dades a l'emissor ???????? 
int main(int argc, char *argv[]){ //si es volen utilitzar paràmetres 
int s;   //el socket 
int n; 
int i, j; 
char c, num_fill[6]; 
struct sockaddr s_struct; //l'estructura del socket 
unsigned int v;  //per guardar el tamany de s_struct 
char msg[50];  //buffer dels missatges 

int a11, a12, a21, a22, b11, b12, b21, b22; 
int a, b, x, d; //Las variables que guardan los valores de las matrices. 
//Introduccion de los valores de la Matriz 1 
printf ("Introduce la primera matriz en orden a11 a12 a21 a22:\n"); 
scanf ("%d %d %d %d", &a11, &a12, &a21, &a22); 
//Introduccion de los valores de la Matriz 2 
printf ("Introduce la segunda matriz en orden b11 b12 b21 b22:\n"); 
scanf ("%d %d %d %d", &b11, &b12, &b21, &b22); 
printf ("Los valores de las matrices son: %d %d %d %d; %d %d %d %d\n", a11, a12, a21, a22, b11, b12, b21, b22); 
//Realizar la introducción de las matrices 


for (i=0;i<4;i++){ 
    printf ("Entra en el for de FORKS\n"); 
     sprintf(num_fill, "Fill%d", i); 
    if (fork()==0){ //es pot crear un procés fill i executar ./receptor 
     printf ("Entra en el fork %d\n", i); 
      execl("./fill", "fill", num_fill, NULL); 
      exit(0);} 
    printf ("Imprimeix nom: %s\n", num_fill); 
} 
printf("Emissor. Esperant uns segons a que el receptor hagi creat el seu socket\n"); 
sleep(1); // ho ha de fer el primer que s'executa per esperar l'altre, de 1s a Xs 


if ((s=socket(AF_UNIX, SOCK_DGRAM,0)) <0){ //crea el socket 
    perror ("Emissor. Error socket:"); 
    exit(1); 
} 
s_struct.sa_family=AF_UNIX; 
strcpy(s_struct.sa_data, FEMISSOR);   //Emisor 
if (bind (s, &s_struct, sizeof(s_struct))<0){ //associa un nom de fitxer al socket 
    perror ("Emissor. Error associant:");  //qui reb és qui ha de fer el bind 
    close(s);  
    exit(2); 
} 
for (i=0; i<4; i++){ 
switch (i) { 
    case 0: 
     a=a11 ; b=a12 ; x=b11 ; d=b21; 
    break; 
    case 1: 
     a=a11 ; b=a12 ; x=b12 ; d=b22; 
    break; 
    case 2: 
     a=a21 ; b=a22 ; x=b11 ; d=b21; 
    break; 
    case 3: 
     a=a21 ; b=a22 ; x=b12 ; d=b22; 
    break; 
    } 
s_struct.sa_family=AF_UNIX; 
sprintf (num_fill, "Fill%d", i); 
strcpy(s_struct.sa_data, num_fill); //envia al fitxer socket del receptor 
v= sizeof(s_struct); 
sprintf(msg, "%d %d %d %d", a, b, x, d); 
printf("Multi. Enviant dades a %s", s_struct.sa_data); 
if((n=sendto(s, msg, strlen(msg)+1, 0, &s_struct, sizeof(s_struct)))<0) { 
    perror ("Multi. Error enviant:\n"); 
    unlink(num_fill);     //Al receptor: FRECEPTOR 
    close (s); 
    exit(3);  
}  
printf("Emissor. %d dades enviades: %s\n", n, msg); 
} 
// for para recibir los datos de los hijos 
for (i=0; i<4; i++){ 

s_struct.sa_family=AF_UNIX; 
strcpy(s_struct.sa_data, FEMISSOR); //envia al fitxer socket del receptor 
if((n=(recvfrom(s, &msg, sizeof(msg), 0, &s_struct, &v)))<0) { 
     perror ("Multi. Error rebent:"); 
     unlink(FEMISSOR);    //Al receptor: FRECEPTOR 
     close (s); 
     exit(3);  //Al receptor: n=(recvfrom(s, &msg, sizeof(msg), 0, &s_struct, &v)) 
    } 
    if (strncmp(s_struct.sa_data,"Fill0",5)==0){ 
     sscanf(msg,"%d", &a);} 
    if (strncmp(s_struct.sa_data,"Fill1",5)==0){ 
     sscanf(msg,"%d", &b);} 
    if (strncmp(s_struct.sa_data,"Fill2",5)==0){ 
     sscanf(msg,"%d", &x);} 
    if (strncmp(s_struct.sa_data,"Fill3",5)==0){ 
     sscanf(msg,"%d", &d);} 
    } 


printf("Datos recibidos de %s\n", s_struct.sa_data); 
printf("Resultado de la multiplicacion:\n"); 
printf("Matriu 1: %d %d\n %10d %d\n", a11, a12, a21, a22); 
printf("Matriu 2: %d %d\n %10d %d\n", b11, b12, b21, b22); 
printf("Matriu R: %d %d\n %10d %d\n\n", a, b, x, d); 
printf("Emissor. Prem una tecla per acabar i eliminar el socket\n"); 

// for para imprimir las matrices. 
scanf("%c",&c); 
unlink(FEMISSOR);   //es tanca el fitxer que s'ha obert al bind 
close(s); 
} 

いるclient.cコード

//#include <sys/un.h>  //per utilitzar sockaddr_un 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> //per utilitzar sockaddr 
#include <unistd.h> 
//s'utilitzen dos fitxers, un pel socket de cada procés. Cada procés fa el bind del seu 
//Al sendto y al recvfrom es posa al camp sa_data el fitxer a qui es fa la petició. 
#define FEMISSOR "multi.socket" // per enviar dades a l'emissor 
#define Fill0 "f0.socket" // per enviar dades al receptor (si és bidireccional) <---- i think those lines are not supposed to exist XD 
#define Fill1 "f1.socket" 
#define Fill2 "f2.socket" 
#define Fill3 "f3.socket" 
int main(int argc, char *argv[1]){ //si es volen utilitzar paràmetres 
int s;   //el socket 
int n; 
char c, num_fill[6]; 
struct sockaddr s_struct; //l'estructura del socket 
unsigned int v;  //per guardar el tamany de s_struct 
char msg[50];  //buffer dels missatges 
int a1, a2, b1, b2; //Las variables para ingresar los numeros. 
int resultado; 
strcpy (num_fill, argv[1]); 
printf ("Creat %s\n", num_fill); 
if ((s=socket(AF_UNIX, SOCK_DGRAM,0))<0){//crea el socket 
perror ("Fill. Error socket:"); 
exit(1); 
} 
s_struct.sa_family=AF_UNIX; 
strcpy(s_struct.sa_data, num_fill);   //El receptor utilitzarà el nom FRECEPTOR 

i f (bind (s, &s_struct, sizeof(s_struct))<0){ //associa un nom de fitxer al socket 
    perror ("Fill. Error associant:");  //qui reb és qui ha de fer el bind 
    close(s);  
    exit(2); 
} 
s_struct.sa_family=AF_UNIX; 
strcpy(s_struct.sa_data, num_fill); 
//Recibe los datos del receptor 
if((n=(recvfrom(s, &msg, sizeof(msg), 0, &s_struct, &v)))<0) { 
    perror ("Receptor. Error enviant:"); 
    unlink(num_fill); //Al receptor: FRECEPTOR 
    close (s); 
    exit(3);  //Al receptor: n=(recvfrom(s, &msg, sizeof(msg), 0, &s_struct, &v)) 
} 

printf("Datos recibidos en %s\n", num_fill); 
sscanf(msg,"%d %d %d %d",&a1,&a2,&b1,&b2); 
resultado = (a1*b1)+(a2*b2); 
printf ("El resultado de %s es: %d\n", num_fill, (int) resultado); 
s_struct.sa_family=AF_UNIX; 
s trcpy(s_struct.sa_data, num_fill); //envia al fitxer socket del receptor 
v= sizeof(s_struct); 
sprintf(msg, "%d", resultado); 
printf("Fill. Enviant resultat a %s\n", s_struct.sa_data); 
if((n=sendto(s, msg, strlen(msg)+1, 0, &s_struct, sizeof(s_struct)))<0) { 
    perror ("Emissor. Error enviant:"); 
    unlink(num_fill);    //Al receptor: FRECEPTOR 
    close (s); 
    exit(3);  
    }  
printf("%s. %d dades enviades: %s\n", num_fill, n, msg); 
unlink(num_fill);   //es tanca el fitxer que s'ha obert al bind  
close(s); 
} 

PS:コードは、二つの2×2アレイをmultipliyingことになっています。親は、子と通信するためのソケットを作成します。 5つのプロセスが必要です。親プロセスは4つの子プロセスを作成し、1つの列に1つの行を掛けて4つの結果整数を取得します。子プロセスは並列実行されます。 メインプロセスは、子プログラムと通信するためのソケットを作成します。子プログラムは作成され、外部プログラムにコード化されます。また、子の#である引数を渡します。チャイルドは独自のソケットを作成します。それぞれは、リンケージに異なるファイルを使用します(fitxerf1、fitxerf2 .... fitxerf4)。親は1秒間、その子がソケットを作成するのを待ちます。 リンクが作成されると、親は各ファイルを使用して各子4のint値を渡します。各子は、各乗算の解を親の通信ファイルに戻す。 最終的に、親はそれぞれの子から受け取ったものと3つの配列(最初のものと結果)を表示します。

+0

出力をコピーして貼り付けることはできますか?我々はそれを作ったどこまで実行を知っている場合は、エラーを発見しやすくなるでしょう。.. – sarnold

+0

サーバーの出力は次のとおりです。するラ紹介: はラ・プリメーラマトリズエンorden A11、A12、A21、A22を導入しますプライマーマトリクスb11 b12 b21 b22:ロスvalores de las matrices son:1 4 7 4; 5 1 2 5 Entraデフォーク ImprimeixのNOM用EL EN:Fill0 Entra ELエンドフォーク Entra EN ELフォーク0 ImprimeixのNOM用:Fill1 Entraデフォーク ImprimeixのNOM用EL EN:Fill2 Entra EL EN FOR FORKS Imprimeixノミ:Fill3 Emissor。エスペラントはセクレタリー・レセプタクル・ソケットソケット エントリー・フォーク3 エントリー・フォーク1 エントリー・フォーク2 マルチ。エラーが発生しました: :そのようなファイルまたはディレクトリがありません – user1163138

+0

解決済みのデータを送受信する4つのプロセスを作成する生の通信ペアserver-clientを取得できますか?私はそれをするためにどのコマンドが使用されているのかを理解することが容易になります。ありがとう、もう一度sarnold ....私はこのようなフォーラムに投票するような何かをすることができますか? – user1163138

答えて

0

出力を簡単に追加できるように投稿を編集していません。それはそのままでは読むことがほとんど不可能であり、私はLindentを通してそれを実行するのを待つことができません。

とにかくの代わりにstruct sockaddr_unを使用してください。そのため、パス名をsun_pathのメンバーに入れることができます。そして、私はあなたがそれを使用する前に構造全体をクリアする必要があると思います。 calloc(3)と割り当ててください:

memset(&s_struct, 0, sizeof(s_struct)); 
+0

回答ありがとうございます、私はここで本当に苦労しています。どうしたの?私はフォーマットがよく書かれたコードを参照してください – user1163138

+0

この混乱を理解するために必要なことは何でもしてください。編集したいのですが、私は保存されたバージョンと作業していないバージョンがたくさんあります。出力はすでにコードに入っていますが、シミュレートされています。結果として4行の列のint値が得られませんが、私はこのコミュニケーションのことを働かせたら、それについて心配します。今ポイントは、私はクライアントコードで "セグメンテーションフォールト"を取得し続けている、私はそれを得るためにポイントする必要がありますか分からない。お時間をありがとう、私は本当に感謝して、私の英語のために申し訳ありません、私はネイティブスピーカーではありません。ありがとうございました。 – user1163138