指导我使用sockets:乘以2x2阵列的服务器客户端程序
我正试图编写一个带有套接字的c代码来与服务器和客户端(或者您更喜欢的是父级和子级)通信,但我真的不知道这一点,我只是不断地出错。我知道我的代码中有很多错误,但现在我不断地得到一个“分段错误”错误。我知道这些元素并不相互指向,但在我的国家为时已晚,这一切对我来说似乎都是一门外语。 如果你能给我任何帮助,我将不胜感激。 就这些,提前谢谢你 SERVER.c代码-------------------------------------------------------------------------------------------------指导我使用sockets:乘以2x2阵列的服务器客户端程序,c,sockets,client,communication,C,Sockets,Client,Communication,我正试图编写一个带有套接字的c代码来与服务器和客户端(或者您更喜欢的是父级和子级)通信,但我真的不知道这一点,我只是不断地出错。我知道我的代码中有很多错误,但现在我不断地得到一个“分段错误”错误。我知道这些元素并不相互指向,但在我的国家为时已晚,这一切对我来说似乎都是一门外语。 如果你能给我任何帮助,我将不胜感激。 就这些,提前谢谢你 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);
}
//#包括///每个实用工具
#包括
#包括
#包括//每个utilitzar sockaddr
#包括
#定义FEMISSOR“多插座”//per enviar dades a l'emissor????????
int main(int ARCC,char *ARGV[]){//Ses VeleN UTILZARAR PARM米
int s;//el套接字
int n;
int i,j;
字符c,数字填充[6];
struct sockaddr s_struct;//l'Esstructure del socket
无符号int v;//每个guardar el tamany de s_结构
char msg[50];//缓冲区数据集错误
int a11、a12、a21、a22、b11、b12、b21、b22;
int a,b,x,d;//矩阵的变量。
//马提兹山谷导言1
printf(“在a11 a12 a21 a22:\n中介绍primera matriz”;
scanf(“%d%d%d%d”、&a11、&a12、&a21和&a22);
//马提兹山谷导言2
printf(“介绍b11 b12 b21 b22:\n中的la segunda matriz”);
scanf(“%d%d%d%d”、&b11、&b12、&b21和&b22);
printf(“las valores de las Matrix son:%d%d%d;%d%d%d%d\n”,a11、a12、a21、a22、b11、b12、b21、b22);
//la Introcción de las矩阵的实现
对于(i=0;i我避免了编辑您的帖子,这样您就可以更容易地添加一些输出;现在阅读几乎是不可能的,我迫不及待地想通过Lindent运行它
无论如何,我认为您应该使用struct sockaddr\u un
而不是struct sockaddr
,这样您就可以将路径名放入sun\u path
成员中。我认为您应该在使用它之前清除整个结构;或者使用calloc(3)
分配它,或者使用:
memset(&s_struct, 0, sizeof(s_struct));
你能复制并粘贴一些输出吗?如果我们知道执行过程有多远,就更容易发现错误。服务器的输出是:介绍la primera matriz en orden a11 a12 a21 a22:1 4 7 4介绍la primera matriz en orden b11 b12 b21 b22:5 1 2 Los valores de las Matrix son:1 4 7 4;5 1 2 5 Entra en el for de FORKS Imprimex nom:Fill0 Entra en el for de FORKS Entra en el fork 0 impimeix nom:Fill1 Entra en el for de FORKS impimeix nom:Fill2 Entra en el for de FORKS impimeix nom:Fill3 Emissor.Esperant uns segons que el receptor hagi create el seu socket Entra en el fork 3 Entra en el fork 1 Entra en el fork 2 Multi.错误环境::没有这样的文件或目录你能帮我得到一个原始的通信对服务器客户端,它创建了4个进程来发送和接收已解决的数据吗?我会更容易理解使用了哪些命令。再次非常感谢sarnold…我能做些什么,比如投票让你加入这个论坛吗?客户端一直在说“分段错误”,沟通真的很糟糕“完成”…叹气!谢谢你的回答,我在这里真的很难。有什么问题吗?我看到代码格式很好,你可以做任何你需要的事情来理解这个混乱。编辑它,你愿意,我有很多保存的和非工作的版本…输出已经在代码中,但它是模拟的,无法获得4个结果行*列的int值,但这是最简单的部分,当我让这个通讯工具工作时,我会担心的。现在的问题是,我一直在得到“分段错误”在客户代码中,我不知道我必须指向哪里才能让它工作。谢谢你的时间sarnold,我真的很感激,对不起,我的英语不是母语。再次感谢你。
memset(&s_struct, 0, sizeof(s_struct));