【发布时间】:2019-06-25 01:53:30
【问题描述】:
我正在尝试创建一个客户端-服务器井字游戏作为家庭作业。我在单独的函数中设置服务器侦听器和连接,而不是在主程序中。服务器套接字创建成功,但是客户端连接失败,我认为这是导致以下seg错误的原因。
我已经查找了类似的问题,并尽我所能对我的代码进行了调整,比如为 sizeof(cli_addr) 设置一个变量,而不是直接将其传递给 accept()。我不知道为什么它不起作用。
这是建立连接的函数
void setup_connections(int serversocket,int *clientsocket,int portnum){
int cli_size,con_num = 0;
struct sockaddr_in cli_addr;
//server is listening for clients
listen(serversocket,5);
while(con_num<2){
cli_addr.sin_family = AF_INET;
cli_addr.sin_addr.s_addr = INADDR_ANY;
cli_addr.sin_port = htons(portnum);
//accept connection while creating client socket
cli_size = sizeof(cli_addr);
clientsocket[con_num] = accept(serversocket,(struct sockaddr *) &cli_addr,cli_size);
if(clientsocket[con_num]<0){
perror("Error: ");
}
con_num++;
}
}
我在编译 cli_size 类型时收到警告。
*警告:不兼容的整数到指针转换将“int”传递给参数 输入'socklen_t *'(又名'unsigned int *')[-Wint-conversion] clientsocket[con_num] = accept(serversocket,(struct sockaddr ) &cli_addr,cli_size);
但是,我检查的所有示例都是这样通过的。
这是设置服务器套接字的函数。
int setup_server(int portnum){
int serversocket,serv_bind;
struct sockaddr_in server_addr;
serversocket = socket(AF_INET, SOCK_STREAM, 0);
if(serversocket<0){
printf("Failed to create server\n");
}
//set up server info
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(portnum); //port number given by user
//link server address to socket
serv_bind = bind(serversocket,(struct sockaddr *) &server_addr,sizeof(server_addr));
if(serv_bind<0){
printf("Failed to bind\n");
}
return serversocket;
}
这是 main.c 中调用它们的代码:
int portnum,serversocket, clientsocket[2]; //sockets
portnum = atoi(argv[1]);
if(argc < 2){
printf("Port number not given");
}
//create sockets
serversocket = setup_server(portnum);
setup_connections(serversocket,clientsocket);
运行程序后得到的是:
错误: : 错误地址
错误: : 错误地址
分段错误:11
如果你能向我解释我做错了什么,那将非常有帮助。
【问题讨论】:
标签: c sockets tcp segmentation-fault client-server