您好,我正在尝试运行简单的服务器 - 客户端游戏。服务器在C中,客户端在java(它的学校项目,我不能改变它)。我的客户端是Windows 7 64位,服务器运行在Virtualbox(Debian 32bit)上我通过WiFi使用桥接连接。我试图只是简单地接受新连接并使用TCP和套接字为它创建新线程。
当我比较client_socket
是否> 0它没关系,客户端已连接。但是当我在if块中放入一些代码时(代码中的注释部分)套接字为-1并且它无法连接(它甚至无法访问代码)。它是什么代码并不重要,即使它是int x = 0
它仍然无效。似乎只有printf()可以。感谢您的任何回应。
perror()
打印"无效的参数"。
这是我的C服务器代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
void *serve_request(void *arg){
printf("Thread is running.\n");
}
int start_server (void){
int server_socket;
int client_socket;
int return_value;
char cbuf;
int *th_socket;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
socklen_t client_addr_len;
pthread_t thread_id;;
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0) return -1;
memset(&server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(10001);
server_addr.sin_addr.s_addr = INADDR_ANY;
return_value = bind(server_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in));
if (return_value == 0)
printf("Bind OK\n");
else{
printf("Bind Error\n");
return -1;
}
return_value = listen(server_socket, 5);
if (return_value == 0)
printf("Listen OK\n");
else{
printf("Listen Error\n");
return -1;
}
while(1){
client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len);
printf("Socket number: %d\n", client_socket);
if (client_socket >= 0 ) {
printf("Socket OK\n");
// #### PROBLEM PART ####
//th_socket=malloc(sizeof(int));
//*th_socket=client_sock;
//thread_id = 0;
//pthread_create(&thread_id, NULL, (void *)&serve_request, (void *)th_socket);
} else {
printf("Socket Error\n");
return -1;
}
}
return 0;
}
答案 0 :(得分:1)
您需要将client_addr_len
初始化为client_addr
结构的大小。 accept
函数使用该参数来确定传递的地址结构类型。
你现在拥有的是undefined behavior,因为未初始化的(非静态)局部变量具有不确定的值(未初始化的非静态变量的内容看似随机)。