【发布时间】:2015-02-17 00:10:16
【问题描述】:
您好,我正在尝试运行简单的服务器客户端游戏。服务器在 C 中,客户端在 java 中(这是学校项目,我无法更改)。我的客户端是 Windows 7 64 位,服务器在 Virtualbox(Debian 32 位)上运行,我通过 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;
}
【问题讨论】:
-
那是我的 client_socket 就像我说没有代码它是积极的代码它是-1。感谢您的快速响应。
-
技术上,
0是一个有效的套接字描述符。 -
当任何系统调用返回-1时,你应该检查
errno的值,或者调用perror,或者打印一些涉及strerror()的消息,以找出究竟是什么错误曾是。没有它,调试只是一场猜谜游戏,寻求外部帮助完全是徒劳的。 -
至于您的问题,您是说
*th_socket在您显示的(注释掉的)代码中是否定的吗?它在线程函数中是否为负(或您未显示的其他代码)? -
对于糟糕的介绍,我深表歉意。我的意思是 client_socket 是否定的。 perror 正在抛出“无效参数”。