我遇到运行一小段代码的问题。这是关于C中的套接字编程。我想要做的是让客户端在两个不同的端口上与服务器通信。但是当我试图编译客户端代码时,我会得到“分段错误”。我在这里给我的客户代码。请让我知道出了什么问题。
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc,char *argv[])
{
int sockfd,newsockfd,sockfd_infinite,sockfd_kitchen,portno,portno1,n,no_of_tables;
struct sockaddr_in serv_addr,kitchen_addr;
struct hostent *server,*kitchen;
struct timeval time_out;
time_out.tv_sec = 15; // 15 seconds
time_out.tv_usec = 0; // 0 milliseconds
// server=gethostbyname(argv[1]);
// char buffer[256];
portno=atoi(argv[2]);
portno1=atoi(argv[4]);
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
error("\nError creating socket");
server=gethostbyname(argv[1]);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(portno);
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
sockfd_kitchen=socket(AF_INET,SOCK_STREAM,0);
if(sockfd_kitchen==-1)
error("\nError creating socket");
kitchen=gethostbyname(argv[3]);
kitchen_addr.sin_family=AF_INET;
kitchen_addr.sin_port=htons(portno1);
bcopy((char *)kitchen->h_addr,
(char *)&kitchen_addr.sin_addr.s_addr,
kitchen->h_length);
n=connect(sockfd_kitchen,(struct sockaddr *)&kitchen_addr,sizeof(kitchen_addr));
if(n==-1)
error("\nError connecting to kitchen");
n=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
if(n==-1)
error("\nError connecting to server");
return 0;
}
所以这段代码背后的想法是 - 有一个客户端,还有一个服务器。此客户端希望在两个不同的端口上与服务器通信,就好像客户端正在与两个不同的服务器通信一样。我在我的笔记本电脑上执行此操作,将服务器名称作为服务器名称和不同端口号的“localhost”。就像你在我的代码中看到的那样,我有两个服务器的两个指针变量,即* server和* kitchen。
例如: ./thiscode localhost 15535 localhost 12345
在我提到的示例中,这就是我编译客户端代码的方式。 argv [1]是第一个“localhost”(服务器名称),argv [2]是第一个服务器的端口号。第二个“localhost”和“12345”是第二个服务器的名称和端口号。
就像我之前说过的那样,我正在尝试在我的笔记本电脑上安装三个不同的代码(一个用于客户端,两个用于服务器)。我的两个服务器代码编译没有任何问题,但我的客户端代码得到这个“分段”错误。请让我知道我哪里出错了。 感谢。
答案 0 :(得分:0)
首先,您应该检查gethostbyname
的返回值:
如果发生错误,gethostbyname()和gethostbyaddr()函数将返回hostent结构或NULL指针。出错时,h_errno变量包含错误编号。
答案 1 :(得分:0)
似乎问题出在bcopy()
函数调用中。
在将内容复制到变量之前,您尚未为变量声明空间,因此您看到了分段错误。
在bcopy()
语句之前输入以下代码以删除Seg-fault:
serv_addr.sin_addr.s_addr=malloc(sizeof(unsigned long));