【问题标题】:TCP server in C, Socket still negativeC中的TCP服务器,套接字仍然为负
【发布时间】: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 正在抛出“无效参数”。

标签: java c sockets tcp


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。太简单了,现在可以了。
猜你喜欢
  • 2017-01-27
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多