【问题标题】:C socket programming, sendC套接字编程,发送
【发布时间】:2012-02-27 09:19:17
【问题描述】:

我编写了一个服务器,当浏览器尝试连接到某些站点时,它会检查黑名单并发送回 404,但是当我调用 send() 时没有错误但消息不会出现在网络上浏览器,除非我关闭连接?

有什么建议吗?

接受来自浏览器的连接

while(1){
    connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen);
    if (connfd == -1) {
        perror ("unable to accept");
        return 1;
    }
    printf("%s:%d connected\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
    printf("%d",threadIndex);
    pthread_create(&(thread[threadIndex++]), NULL, processRequests, (void *)connfd);

    }

Process Requests 方法发送 sn -p:

if(blacklisted ==1){
                    printf("is blacklisted\n");
                    char *response404 = "HTTP:/1.1 404 not avaliable\r\n\r\n";

                    printf("%s\n",response404);
                    int len, bytes_sent;
                    len = strlen(response404);
                    bytes_sent = send(connfd, response404, len, 0);
                    if(len != bytes_sent){
                        perror("message length doesn't match");

                    }
            }

【问题讨论】:

  • 在第 42 行检查您的意思是 i 而不是 j
  • 不应该每个线程都有自己的connfd 副本吗?看起来在您的代码中它们都共享同一个变量。
  • 尝试在您的回复中添加“content-length: 0”或另一个 \r\n。在您关闭连接之前它不会显示,因为它仍在等待消息内容。
  • 看看其他例子,我认为我处理 connfd 和线程的方式是正确的?
  • 我尝试添加这些,似乎没有用

标签: c sockets networking


【解决方案1】:

浏览器在解析和显示页面之前正在等待连接关闭。

没有办法。

在 HTTP/0.9 和 1.0 中,连接在单个请求/响应对后关闭。

在 HTTP/1.1 中引入了一种 keep-alive-mechanism,其中一个连接可以重复用于多个请求。

注意: Keepalive 技术在这里没有用,因为您为每个连接到特定位置的客户端发送一个页面。

【讨论】:

  • 所以必须为每个请求/响应对关闭并重新打开连接?
  • 每次向浏览器发送内容时,必须在之后关闭连接,以便浏览器知道服务器端何时完成发送所有要在浏览器中解析的数据。所以基本上你必须创建一个循环来处理打开和关闭 tcp 连接。
  • 谢谢,这很有效:) 虽然当我尝试创建一个新线程时我遇到了段错误,我的线程创建循环是否正确?
  • @drunkmonkey 不幸的是,我在线程编程方面没有真正的经验,所以我的建议是创建另一个问题或谷歌搜索一些不错的线程教程。
猜你喜欢
  • 2018-09-13
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多