Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TCP服务器在C中,套接字仍然为负_Java_C_Sockets_Tcp - Fatal编程技术网

Java TCP服务器在C中,套接字仍然为负

Java TCP服务器在C中,套接字仍然为负,java,c,sockets,tcp,Java,C,Sockets,Tcp,嗨,我正在尝试运行简单的服务器客户端游戏。服务器是C语言的,客户端是java语言的(这是学校的项目,我无法更改)。我的客户端是Windows 7 64位,服务器运行在Virtualbox(Debian 32位)上,我通过WiFi使用桥接连接。我试图简单地接受新连接,并使用TCP和套接字为其创建新线程 当我比较client\u socket是否大于0时,一切正常,客户端已连接。但是,当我在if块中放入一些代码(下面代码中的注释部分)时,套接字是-1,它无法连接(它甚至无法到达代码)。它是什么代码并

嗨,我正在尝试运行简单的服务器客户端游戏。服务器是C语言的,客户端是java语言的(这是学校的项目,我无法更改)。我的客户端是Windows 7 64位,服务器运行在Virtualbox(Debian 32位)上,我通过WiFi使用桥接连接。我试图简单地接受新连接,并使用TCP和套接字为其创建新线程

当我比较
client\u socket
是否大于0时,一切正常,客户端已连接。但是,当我在if块中放入一些代码(下面代码中的注释部分)时,套接字是-1,它无法连接(它甚至无法到达代码)。它是什么代码并不重要,即使它是
intx=0
它仍然不工作。似乎只有printf()是可以的。谢谢你的回复

peror()
打印“无效参数”

以下是我的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;
}   
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效*送达请求(无效*参数){
printf(“线程正在运行。\n”);
}
int start_服务器(无效){
int-server_-socket;
int客户机接口;
int返回值;
半焦cbuf;
int*th_插座;
服务器地址中的结构sockaddr\u;
客户端地址中的结构sockaddr\u;
socklen\u t客户地址;
pthread_t thread_id;;
服务器\u套接字=套接字(AF\u INET,SOCK\u STREAM,0);
if(server_socket<0)返回-1;
memset(&server_addr,0,sizeof(struct sockaddr_in));
服务器地址sin家庭=AF网络;
服务器地址sin端口=htons(10001);
server\u addr.sin\u addr.s\u addr=INADDR\u ANY;
return_value=bind(server_socket,(struct sockaddr*)和server_addr,sizeof(struct sockaddr_in));
if(返回值=0)
printf(“绑定确定\n”);
否则{
printf(“绑定错误\n”);
返回-1;
}
返回\u值=侦听(服务器\u套接字,5);
if(返回值=0)
printf(“侦听确定\n”);
否则{
printf(“侦听错误\n”);
返回-1;
}
而(1){
client\u socket=accept(server\u socket,(struct sockaddr*)&client\u addr,&client\u addr\u len);
printf(“套接字编号:%d\n”,客户端\u套接字);
如果(客户端\u套接字>=0){
printf(“套接字正常\n”);
//#####问题部分####
//th_套接字=malloc(sizeof(int));
//*th_socket=客户端_sock;
//线程id=0;
//pthread_创建(&thread_id,NULL,(void*)和service_请求,(void*)th_套接字);
}否则{
printf(“套接字错误\n”);
返回-1;
}
}
返回0;
}   

您需要将
client\u addr\u len
初始化为
client\u addr
结构的大小。
accept
函数使用该参数确定传递的地址结构类型


您现在看到的是,由于未初始化(非静态)局部变量具有不确定的值(未初始化的非静态变量的内容似乎是随机的)。

这是我的客户端\u套接字,就像我说的,没有代码,代码为正,代码为-1。感谢您的快速响应。从技术上讲,
0
是一个有效的套接字描述符。当任何系统调用返回-1时,您都应该检查
errno
的值,或者调用
perror
,或者打印一些涉及
strerror()
的消息,以查明错误的确切原因。没有这一点,调试只是一个猜测游戏,寻求外部帮助完全是徒劳的。至于你的问题,你是说
*th__socket
在你显示的(未注释的)代码中是否定的吗?线程函数(或其他未显示的代码)是负数吗?很抱歉,演示不好。我的意思是客户端是负数。佩罗尔正在抛出“无效论点”。非常感谢。很简单,现在一切都好了。