【问题标题】:how can I use multithreading on a server program to connect and send data to browser when I'm requesting from the browser?当我从浏览器请求时,如何在服务器程序上使用多线程连接并向浏览器发送数据?
【发布时间】:2012-08-01 04:29:59
【问题描述】:

我试图在我的服务器程序中使用多线程,这样当我从浏览器收到请求时,我的服务器应该打开一个 txt 文件并将其发送到浏览器进行显示。 我需要做的是有一个单独的函数,每次有来自浏览器(客户端)的请求时,它都会在我的 main 内部进行发送/接收,例如:127.0.0.1:3490/index.txt 我设法仅使用我的 main 函数为一个请求执行此操作,但我无法将所有内容都放入我的线程函数并将其发送到浏览器。

我将不胜感激 以下是我的代码:

#include <stdio.h>
#include<stdlib.h>
#include <winsock.h>
#include <stddef.h>
#define NUM_THREADS 10
#define MYPORT 3490
void *PrintData(void *thread);  
int main() {
    WSADATA wsaData;
    SOCKET s;
    unsigned fd;
    struct sockaddr_in my_addr;
  WSAStartup(MAKEWORD(1, 1), &wsaData);
  my_addr.sin_family = AF_INET;
  my_addr.sin_port = htons(MYPORT);
  my_addr.sin_addr.s_addr = INADDR_ANY;
  memset(my_addr.sin_zero, '\0', sizeof(my_addr.sin_zero) );

  s=socket(PF_INET,SOCK_STREAM, 0);
  if(s<0) printf("socket failed\n");
  if ( (bind(s, (struct sockaddr *)&my_addr, sizeof(my_addr)) ) !=0){ printf("Bind failed!\n");}
  listen(s,10);

    while(1) {
        fd=accept(s,NULL,NULL);
         printf("Client connected\r\n");
        CreateThread(NULL,(DWORD)NULL,(LPTHREAD_START_ROUTINE)PrintData,(void*)fd,(DWORD)NULL,NULL);  // creating threads
    }
    closesocket(fd);    
    WSACleanup();
}

void *PrintData(void *thread){
   char *header="HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
    char data[512];
    char filename[256];
    FILE *f; 
    printf("It's me, thread!\n");
    SOCKET curr_client = (SOCKET)thread;
    int res;
    while(1){
        res=recv(curr_client,data,512,0);              
        ///data[res]=0;                         
        Sleep(10);
        if(res == 0) printf("error: res == 0");

        sscanf(data,"GET /%s ",filename);  
        printf("Get: %s %d\n", filename, res);
        send(curr_client,header,strlen(header),0);  
        f=fopen(filename,"rb");            
        if(f == NULL){ fputs("Can not find the file!", stderr); }
        while(!feof(f)){
            printf("heloooo");
            int retVal = fread(data, 1, sizeof(data), f);
            ///printf("data is : %s\n", data);
            send(curr_client, data, sizeof(data), 0); 
        }
    }
    fclose(f);
    ExitThread((DWORD)NULL);
}

【问题讨论】:

  • 我已经弄清楚了如何解决我在上述问题中遇到的问题,以防其他人可能有同样的问题,我将把我的解决方案放在这里

标签: c multithreading


【解决方案1】:

首先,不要在main函数中关闭fd。现在你根本不会关闭它,因为循环是无限的,这意味着你有一个资源泄漏。你在线程函数中做的最后一件事是调用closesocket(curr_client);

其次,在线程中你永远循环,永远不会跳出循环。当读取文件出错,到达文件末尾,或从/向套接字接收/发送时出错,您应该跳出无限循环。这是遵循 HTTP 规范的,即服务器应在每次请求后关闭连接。

【讨论】:

  • 感谢您的提示。我已将代码更改为您提到的所有内容,但运行程序仍然存在问题。它不会将我的数据发送到客户端(浏览器)并且浏览器进入等待状态但不显示任何内容。如果有人能以我的发送功能正常工作的方式修复我的代码,那就太好了。
【解决方案2】:
while(1) {
fd=accept(s,NULL,NULL);             
n=recv(fd,data,512,0);              
data[n]=0;                        
sscanf(data,"GET /%s ",filename);  
printf("Get: %s %d\n", filename, n);      
send(fd,header,strlen(header),0);  
f=fopen(filename,"rb");             
if(f == NULL){ fputs("file error", stderr); } 
fread(data, 1, sizeof(data), f); 
returnVal = send(fd, data, strlen(data), 0); 
if(returnVal<0) printf("Your tester failes!\n\n"); 
fclose(f);
closesocket(fd);                   
}

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 2023-03-28
    • 2021-07-15
    • 1970-01-01
    • 2019-03-30
    • 2021-03-30
    • 2011-07-12
    • 2013-08-01
    • 2018-09-17
    相关资源
    最近更新 更多