【问题标题】:my program does not open a socket我的程序没有打开套接字
【发布时间】:2012-08-22 17:47:57
【问题描述】:

这是我编写的聊天客户端服务器程序的服务器部分。我创建了一个线程池,服务器必须将连接的客户端与线程相关联。线程函数 gestisci() 接收来自客户端的命令并将消息从客户端 1 发送到客户端 2。但是,一旦我运行它,终端上就什么也没有出现。有人可以帮我吗?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include<sys/wait.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>

#define BACKLOG_SIZE 5
#define SA struct sockaddr

void* gestisci_richiesta(void*dati)

int main(int argc, char* argv[]) {

    printf("in main function\n");
    struct sockaddr_in srv_addr, cl_addr;
    int ret, sock, cn_sk, porta, t;
    struct argomenti{
        int sock_cl,stato;
        struct sockaddr_in cl_addr;
        int index;}
    struct argomenti mess[BACKLOG_SIZE];
    int arg_cont[BACKLOG_SIZE];
    socklen_t len;
    int t_free[BACKLOG_SIZE];
    pthread_t tid[BACKLOG_SIZE];

    if (argc < 2)
        printf("errore:inserire numero porta\n");

    porta = atoi(argv[1]);
    printf(" %d\n", porta);

    sock = socket(PF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        printf("server: impossibile creare un nuovo socket.\n");
        return 0;
    }

    memset(&srv_addr, 0, sizeof(srv_addr));
    srv_addr.sin_family = AF_INET;
    srv_addr.sin_addr.s_addr = htonl(INADDR_ANY );/* il server si mette in ascolto suqualsiasi delle sueinerfacce di rete*/
    srv_addr.sin_port = htons(porta);

    ret = bind(sock, (SA*) &srv_addr, sizeof(srv_addr));
    if (ret == -1) {
        printf("server : impossibile eseguire il bind sul socket.\n");
        return 0;
    }
    printf("bind con successo\n");

    listen(sock, BACKLOG_SIZE);
    for (t = 0; t < BACKLOG_SIZE; t++) {
        t_free[t] = 0;
        client[t] = 0;
    }

              t= 0;
    while (1) {

        while (t_free[t] != 0)
            t = (t + 1) % BACKLOG_SIZE;
        t_free[t] = 1;
        len = (socklen_t) sizeof(mess[t].cl_addr);
        cn_sk = accept(sock, (SA*) &mess[t].cl_addr, &len);
        mess[t].sock_cl = cn_sk;
        mess[t].index = t;
        printf("client:%d connesso\n", t);
        if (cn_sk == -1) {
            printf("SERVER: errore in attesa di connessione\n");
            return 0;
        }
        if (pthread_create(&tid[t], 0, gestisci_richiesta, (void*) &mess[t])) {
            printf("server:impossibile avviare un thread dal pool\n");
            return 0;
        }
    }
}

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow!请阅读常见问题解答stackoverflow.com/faq,其中包含如何发布问题以获得最佳回复的说明。特别是,您应该包括您迄今为止对解决方案的尝试,以便我们可以提供更具体的解决方案。此外,请仅包含属于问题的部分源代码。谢谢,祝你好运!
  • 起点:您必须检查sendwriterecv 的返回值并采取相应措施。你也不能假设send 已经发送了所有内容。
  • 谢谢,我删除了 gestisci() 函数,但实现并不那么重要。我的问题是,当我使用低于 1024 的端口时,绑定不起作用,如果我使用高于 1024 的端口,我在终端中没有看到任何东西。我的操作系统是 ubuntu 操作系统。
  • Afaik,低于 1024 不能工作...它们应该是系统保留的
  • 这是看起来奇怪的确切代码:ret = bind(sock, (SA*) &amp;srv_addr, sizeof(srv_addr)) [...] printf("bind con successo"); 吗?

标签: c sockets


【解决方案1】:

您在其中几个 printfs 上缺少 \n,这将导致它们被缓冲而不是立即打印出来。

存在其他问题。您调用 socket() 的错误消息具有误导性。尚未尝试使用指定的端口。这发生在 bind() 中。没有理由假设客户端的数量将等于积压的大小。 sockaddr_in 的大小始终相同:无需每次都重新计算。

【讨论】:

    【解决方案2】:

    你应该在while(1)之前移动t = 0;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多