2012-02-26 114 views
1

我写过一个服务器,当浏览器试图连接到某些站点时,它会检查一个黑名单并返回一个404,但是当我调用send()时,没有错误,除非关闭连接,否则不会出现在Web浏览器上?C socket编程,发送

有什么建议吗?从浏览器

接受连接

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); 

    } 

进程请求发送方法片断:

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"); 

        } 
      } 
+2

检查第42行,你是指“我”而不是“j”。 – 2012-02-26 23:55:36

+0

我已经添加了一些代码,对不起 – drunkmonkey 2012-02-27 00:01:51

+0

不应该每个线程都得到自己的'connfd'副本吗?它看起来像你的代码,他们都共享相同的变量。 – 2012-02-27 00:07:18

回答

3

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

没有办法。

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

在HTTP/1.1中引入了一个保持活动机制,其中一个连接可以重复用于多个请求。

注:保持连接技术已经没有用了,因为在这里你发送一个单页为每个客户端连接到特定的位置。

+0

所以连接必须关闭,并重新打开每个请求/响应对? – drunkmonkey 2012-02-27 00:30:20

+0

每次向浏览器发送内容时,必须先关闭连接,以便浏览器知道服务器端何时完成发送所有要在浏览器中解析的数据。所以基本上你必须创建一个处理打开和关闭tcp连接的循环。 – EskoBra 2012-02-27 00:42:10

+0

谢谢,那工作:)虽然当我尝试创建一个新的线程我得到一个段错误,是我的线程创建循环是否正确? – drunkmonkey 2012-02-27 01:24:04