客户端服务器聊天框程序中的分段错误原因

时间:2017-08-04 07:38:47

标签: c

我收到分段错误 这是代码

client.c

#include <stdio.h>      
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include<stdlib.h> 
#include<string.h>
#include<unistd.h>
#include <arpa/inet.h>
#define PORT 10001 

主要

int main(int argc ,char *argv[])
{
  struct sockaddr_in address;
  int sock = 0, valread,i=1;
  struct sockaddr_in serv_addr;
  char *hello = "Hello from client";
  char buffer[1024] = {0};
  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    printf("\n Socket creation error \n");
    return -1;
  }
  memset(&serv_addr,'0',sizeof(serv_addr));

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(PORT);
  if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) 
  {
    printf("\nInvalid address/ Address not supported \n");
    return -1;
  }

  if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
  {
    printf("\nConnection Failed \n");
    return -1;
  }
  send(sock , hello , strlen(hello) , 0 );
  //printf("Hello message sent\n");
  valread = read( sock , buffer, 1024);
  printf("%d\t %s \n",i,buffer);

  **here i am getting segmentation fault**
  while(1)
  {
    valread = read( sock , buffer, 1024);
    printf("%d\t %s \n",i,buffer);
    scanf("%s",hello);
    send(sock , hello , strlen(hello) , 0 );

    i++;
    if(strcmp(buffer,"bye")==1)
    {
      break;
    }

  }

  return 0;
}

2 个答案:

答案 0 :(得分:2)

char *hello = "Hello from client";

可以,直到您使用scanf写入hello。由于hello被声明为指向文字的指针,因此只读

单独保留hello消息,并声明更大的缓冲区(如果您有更长的时间可以告诉):

char answer[100];

并使用限制扫描:

scanf("%99s",answer);

除此之外:匹配时strcmp返回0。因此,与"bye"相比,您可以按照自己的意愿工作。

答案 1 :(得分:1)

你有一个指向字符串文字的指针:

char *hello = "Hello from client";

然后将此指针用于scanf

scanf("%s",hello);

不能修改字符串文字。

您可以使用数组来解决此问题,而不是在评论中建议:

char hello[] = "Hello from client";

甚至更好地指定适当的大小:

#define MY_BUFFER_SIZE 500
char hello[MY_BUFFER_SIZE] = "Hello from client";

或者您也可以使用动态内存分配。

在任何情况下,您都应该知道scanf的尺寸不受限制。