C / unix套接字:由于char指针(?)导致的分段错误(核心dumbed)

(也许是这个问题的重复,但我发现很难自己查明我的问题,所以如果这里的答案与其他问题几乎相同,我会尝试删除这个问题)

我想创建一个客户端和一个服务器程序(使用pthreads的多个客户端),其中每个客户端发送N个号码(由用户输入)到服务器,服务器返回这些号码的平均值,如果是“确定消息”,如果平均值> 10,否则服务器返回“不正常消息”。

在客户端打印服务器的结果之后,询问用户是否要为其平均值输入新的数字序列。

这是我到目前为止的地方:

客户:

#include  #include  #include  #include  #include  #include  #include  #define SOCK_PATH "avg_socket" int main(void) { int i, s, t, len, done; int numofintegers; int yesorno; int average, avg; char *sequencecheck; struct sockaddr_un remote; char str[100]; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } printf("Trying to connect...\n"); remote.sun_family = AF_UNIX; strcpy(remote.sun_path, SOCK_PATH); len = strlen(remote.sun_path) + sizeof(remote.sun_family); if (connect(s, (struct sockaddr *)&remote, len) == -1) { perror("connect"); exit(1); } printf("Connected.\n"); done = 0; do { printf("Give the number of integers:"); fscanf(stdin, "%d", numofintegers); send(s, &numofintegers, sizeof(numofintegers), 0); int ar[numofintegers]; for(i=0;i "); fscanf(stdin, "%d", ar[i]); } send(s, &ar, numofintegers*sizeof(int), 0); sequencecheck=recv(s, str, 100, 0); if(strcmp(sequencecheck, "Sequence Ok")) { average=recv(s, avg, sizeof(avg), 0); printf("Average of numbers: %d", avg); } send(s, &yesorno, sizeof(yesorno), 0); if(!yesorno) { done=1; } } while (!done); close(s); return 0; } 

我不断从客户端获得分段错误,我猜这里的指针变得流氓在这里sequencecheck=recv(s, str, strlen(str), 0);

但正如我上面所说,我很难找到实际问题。

我的代码中存在哪些问题?

  sequencecheck=recv(s, str, strlen(str), 0); 

您尚未为str分配任何值,因此它不指向字符串。 所以调用strlen是没有意义的 – 你试图得到什么字符串的长度?

我强烈建议您停止编码并开始记录您计划使用的网络协议。 在字节级别记录它。 定义“消息”的内容并指定它们的描述方式。

您可以查看现有协议(如HTTP,SMTP或IRC)的文档以获得想法。 显然,你的不必那么详细,但它应该指定服务器和客户端如何启动连接,决定消息的开始和结束位置,以及拆除连接。

它应该提供足够的细节,以便两个不同的人可以仅使用协议文档来实现服务器和客户端,并能够交换数据。