C中的TCP服务器,Socket仍为负数

时间:2014-12-18 08:58:42

标签: java c sockets tcp

您好,我正在尝试运行简单的服务器 - 客户端游戏。服务器在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;
}   

1 个答案:

答案 0 :(得分:1)

您需要将client_addr_len初始化为client_addr结构的大小。 accept函数使用该参数来确定传递的地址结构类型。

你现在拥有的是undefined behavior,因为未初始化的(非静态)局部变量具有不确定的值(未初始化的非静态变量的内容看似随机)。