我收到分段错误 这是代码
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;
}
答案 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
的尺寸不受限制。