我遇到了运行一小块代码的问题。这是关于在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本地主机15535本地主机12345
在我所提到的例子,这是我怎么编译我的客户端代码。 argv [1]是第一个“localhost”(服务器名称),argv [2]是第一个服务器的端口号。第二个“localhost”和“12345”是第二个服务器的名称和端口号。
就像我以前说过的,我试图在我的笔记本电脑上运行三个不同代码的窗口(一个用于客户端,另一个用于服务器)。我的两个服务器代码编译没有任何问题,但我的客户端代码得到这个'分段'错误。请让我知道我要去哪里错了。 谢谢。
短的编译器中的一个错误,你_not_得到一个SEGV当你编译。你跑步的时候就会得到它。在那里,我已经达到了一天的配套定额:-) – paxdiablo
当你在程序崩溃,分段错误或任何其他情况下,作为程序员的第一反应应该是在调试器中运行你的程序。它将帮助您找到崩溃的位置,并让您检查变量以帮助您找出事故原因。 –
几点意见:(1)你的代码在使用argv之前没有检查argc,所以如果你运行程序时没有参数,那么你会在那里溢出。 (2)即使给出了正确的参数个数,你也应该检查它们是否被正确解析。 (3)valgrind在运行此代码时会产生大量输出,因此您应该遵循Joachim的建议。 –