- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在构建一个真正的基本代理服务器到我现有的HTTP服务器中。将传入连接添加到队列中,并将信号发送到另一个等待线程队列中的一个线程。此线程从队列中获取传入连接并对其进行处理。
问题是代理程序真的很慢。加载reddit.com需要1分钟。很明显,它没有同时做任何事情。以下是代理函数:
void ProxyConnection::handleConnection() {
if (req->getRequestMethod().compare("GET") == 0) {
addrinfo host_info;
addrinfo *host_info_list;
int proxy_sockfd;
ssize_t n;
memset(&host_info, 0, sizeof host_info);
host_info.ai_family = AF_INET;
host_info.ai_socktype = SOCK_STREAM;
n = getaddrinfo(req->getRequestParam("Host").c_str(), "80",
&host_info, &host_info_list);
if (n == -1)
cout << "ERROR: getaddrinfo" << endl;
proxy_sockfd = socket(host_info_list->ai_family,
host_info_list->ai_socktype,
host_info_list->ai_protocol);
if (proxy_sockfd == -1)
Utils::error("ERROR creating socket");
n = connect(proxy_sockfd, host_info_list->ai_addr,
host_info_list->ai_addrlen);
if (n == -1)
cout << "ERROR connecting" << endl;
// send the request to the destination server
send(proxy_sockfd, req->getSource().c_str(),
req->getSource().length(), 0);
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
setsockopt(proxy_sockfd, SOL_SOCKET, SO_RCVTIMEO,
(char *)&tv,sizeof(struct timeval));
// receive the destination server's response, and send that
// back to the client
while ((n = recv(proxy_sockfd, buf, MAX_BUF, 0)) > 0) {
send(sockfd, buf, n, 0);
}
}
}
recv()
函数上设置了5秒超时,因为有时它不必要地阻塞(即它已经接收到它要接收的所有信息,但是它一直在等待)长达一分钟。
câu trả lời hay nhất
首先,我认为你可以修改连接,连接消耗时间。一个连接超时是75秒。因此,您可以将其修改为Noocket套接字,然后使用SELECT等待结果(此方法称为异步连接)。
如果连接返回错误,则必须关闭套接字。因为当套接字连接发生错误时,套接字将不可用。你必须关闭它并创建一个新的套接字来连接。
因为您是流套接字,所以必须测试send和recv返回。它可能返回的数据不够或更多。所以你必须打包和解包数据。
使用SETSOCKOPT设置超时并不完美。您也可以使用select。选择时间精度优于setsockopt。
我希望我的回答能帮助你。
关于c++ - 多线程多套接字同时发送/接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28253226/
Tôi đang duy trì một số mã Java và hiện tôi đang chuyển đổi nó sang C#. Mã Java thực hiện điều này: sendString(somedata + '\000'); Trong C# tôi đang cố gắng làm điều tương tự: sen
Làm cách nào để xác định xem tham số được truyền trong hàm là một chuỗi hay một ký tự (không chắc cách gọi chính xác) theo nghĩa đen? Hàm của tôi (không chính xác): void check(const char* str) { // một số mã ở đây }
Tôi thực sự không biết cách đặt câu hỏi này một cách chính xác, nhưng tôi hy vọng tiêu đề đã làm rõ điều đó. Tôi đang tìm một cách (khung/thư viện) cung cấp khả năng thực hiện hàm String.contains() để cho tôi biết liệu một chuỗi đã cho có khớp với tìm kiếm hay không
Tôi đang cố gắng viết thứ gì đó đọc biểu thức Lambda và xuất ra phiên bản beta rút gọn. Loại Lambda như sau: \variable -> biểu thức và biểu mẫu ứng dụng là (biểu thức) (biểu thức). Vì vậy
Bài đăng đầu tiên trên StackOverflow, tôi xin lỗi nếu tôi không hiểu đúng. Tôi bị mắc kẹt trong một bài tập ngớ ngẩn khi tôi cần tạo một "Trò chơi Hangman", trong đó tôi thử đọc các từ trong tệp ".txt" và sau đó tôi nhận được chức năng mã hóa sẽ
Tôi muốn kiểm tra chú thích tùy chỉnh Java của mình trong Groovy nhưng không thể kiểm tra do vấn đề về ký tự. Groovyc: 'a' được mong đợi là hằng số nội tuyến của loại cha
Khi tôi cố chạy javascript location.href trong khi nhấp vào nút, tôi gặp lỗi sau "Quá nhiều ký tự trong word rune". CÂU TRẢ LỜI HAY NHẤT Tôi có nên sử dụng OnClientClick thay thế không? Bạn cũng có thể muốn dừng lại
Tôi muốn một cái gì đó như: let a = ["v".utf8[0], 1, 2] Gần nhất tôi có thể nghĩ đến là: let a = [0x76, 1, 2] và "v".data(using : String .Encod
Có cách nào để chỉ định rune từ Unicode trong MySQL không? Tôi muốn thay thế các ký tự Unicode bằng các ký tự Ascii như thế này: Cập nhật MyTbl Đặt MyFld = Thay thế(
Sau khi đọc đặc tả PNG, tôi hơi ngạc nhiên. Tôi đã đọc rằng từ rune phải được mã hóa cứng với giá trị nhị phân như 0x41, không phải ở dạng 'A' (thân thiện với lập trình viên). Sự cố dường như xảy ra trong quá trình biên dịch trên các hệ thống khác nhau với các bộ ký tự cơ bản khác nhau
Hãy xem xét trình biên dịch C++ 11 với bộ ký tự triển khai UTF-8 (và tuân thủ ABI x86-64 yêu cầu loại char phải là byte 8 bit đã ký). Chữ cái Ä (âm sắc) có mã unicode là. 0xC4
Tại sao không có chữ rune UTF-8 trong C11 hoặc C++ 11 mặc dù có chuỗi ký tự UTF-8? Tôi biết rằng, nói chung, một ký tự rune đại diện cho một ký tự ASCII duy nhất, giống như một điểm mã UTF-8 một byte,
Làm sao tôi có thể làm điều này với Jade? làm cách nào tôi có thể làm điều này? Tôi có thể làm hầu hết mọi việc ngoại trừ việc giới thiệu một khoảng ở giữa câu. Câu trả lời hay nhất h3.blur tôi sẽ làm như thế nào.
Đây có vẻ là một câu hỏi rất đơn giản nhưng tôi chỉ muốn làm rõ những nghi ngờ của mình. Tôi đang xem mã được viết bởi các nhà phát triển khác. Có một số tính toán liên quan đến số float. Ví dụ: Float fNotAvlbl = new Float(-99);
Tôi muốn biết "dec" ở dòng 3 "if dec:" nghĩa là gì 1 def dec2bin(dec): 2 result='' 3 if dec:
Tôi đang cố gắng tìm các từ trong chuỗi không chứa bất kỳ ký tự "a" nào. Tôi đã viết đoạn mã sau nhưng nó không hoạt động. Làm cách nào tôi có thể nói "không bao gồm" với biểu thức chính quy? Tôi không thể sử dụng ký hiệu "^" có nghĩa là "không" được sao? nhập lại string2 = "asfd
Câu hỏi này đã có câu trả lời ở đây: Toán dấu phẩy động có bị hỏng không? (31 câu trả lời) Có độ chính xác tùy ý của dấu phẩy động không?
Tôi đang tạo một ứng dụng văn bản phong cách nhưng ở đâu đó tôi gặp lỗi ("Quá nhiều ký tự trong word rune"). Mình chỉ viết một chữ thôi nhưng khi dán vào thì nó chuyển thành nhiều chữ như thế này: "\uD83C\uDD89", chữ gốc là "
Tôi đang cố kiểm tra xem người dùng đã nhập giá trị số vào hộp văn bản chưa và liệu vị trí thập phân có được chấp nhận hay không. Bất kỳ trợ giúp được đánh giá rất cao. Hộp văn bản phụ riêng tư1_AfterUpdate() Nếu IsNumeric(textbox1
Tôi biết rằng một Byte là 8 bit, nhưng những byte khác thể hiện điều gì? Tôi đang tham gia một lớp lắp ráp sử dụng kiến trúc Motorola 68k và tôi đang bối rối với từ vựng hiện tại. Câu trả lời tốt nhất là hướng dẫn sử dụng cho
Tôi là một lập trình viên xuất sắc, rất giỏi!