【发布时间】:2016-10-21 20:46:51
【问题描述】:
我正在尝试制作一个简单的客户端-服务器程序,但客户端总是出现分段错误。我检查了 IP 地址、端口,尝试了许多替代解决方案,但对我不起作用。
服务器代码:
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char const *argv[])
{
int sock,mysock;
struct sockaddr_in server;
char buff[1024];
char s[256];
if (!gethostname(s, sizeof s))
{
printf ("Machine: %s\n", s);
{
struct hostent *host= gethostbyname(s);
if (host != NULL)
{
struct in_addr **adr;
for (adr = (struct in_addr **)host->h_addr_list; *adr; adr++)
{
printf("IP : %s\n", inet_ntoa(**adr));
}
}
}
}
/*creation du socket*/
sock=socket(AF_INET,SOCK_STREAM,0);
if (sock<0)
{
perror("creation de socket echouer\n");
exit(1);
}
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=5000;
if (bind(sock, (struct sockaddr *) &server,sizeof(server)) < 0)
{perror("ERROR on binding");
exit(1);}
/*listen for just 1 connection*/
listen(sock,1);
mysock=accept(sock,(struct sockaddr *)0,0);
if (mysock==-1)
{
perror("accept failed");
exit(1);
}
write(mysock,"you are connected to: my server\n",55);
read(mysock,buff,sizeof(buff));
printf("%s\n",buff);
gets();
close(sock);
close(mysock);
return 0;
}
客户端代码:
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char const *argv[])
{
int sock;
struct sockaddr_in server;
struct hostent *hp;
char buff[1024];
/*creation du socket*/
sock=socket(AF_INET,SOCK_STREAM,0);
if (sock<0)
{
perror("creation de socket echouer\n");
exit(1);
}
server.sin_family=AF_INET;
hp = gethostbyname(argv[1]);
if (hp == NULL) {
perror("ERROR, no such host\n");
exit(0);
}
printf("0\n");
server.sin_addr.s_addr=inet_addr("127.0.1.1");
server.sin_port=htons(5000);
printf("1\n" );
if (connect(sock,(struct sockaddr *)&server,sizeof(server)<0))
{
perror("connection failed");
exit(1);
}printf("2\n");
read(sock,buff,sizeof(buff));
printf("%s\n",buff);
write(sock,"thanks for accepting me\n",25);
system("PAUSE");
close(sock);
return 0;
}
【问题讨论】:
-
您是否正在向您的程序传递参数。
-
使用参数运行程序。它将开始显示错误
-
SO 不是调试服务。使用符号编译,在调试器中运行代码以逐行跟踪程序,检查相关变量的值以了解实际情况。如果出现具体问题,请随时返回此处。
标签: c sockets segmentation-fault client-server