- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 bittorrent 客户端,需要通过 TCP 连接联系多个跟踪器。为此,我编写了如下所示的 winsock 包装器类:
class trackerSocket{
public:
~trackerSocket();
int trackerInitialize(string address);
int trackerSend(string getParams);
int trackerRecv();
be_node *responseDict;
bool working;
private:
string address;
string port;
string protocol;
string page;
SOCKET ConnectSocket;
int parseAnnounce(string announce);
int parseTrackerResponse(string response);
};
程序首先将一个新的 trackerSocket 类分配给一个变量。在此函数上调用 trackerInitialize 函数,如果成功,该类将被推送到一个 vector 上以存储所有工作跟踪器。这是 trackerInitialize 函数:
int trackerSocket::trackerInitialize(string announce){
WSADATA wsaData;
int iResult;
working = true;
iResult = parseAnnounce(announce);
if(iResult != 0){
working = false;
return iResult;
}
//Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if(iResult != 0){
return 1;
}
struct addrinfo *result = NULL,
*ptr = NULL,
hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
//Resolve the server address and port
iResult = getaddrinfo(address.c_str(), port.c_str(), &hints, &result);
if(iResult != 0){
WSACleanup();
return 1;
}
ConnectSocket = INVALID_SOCKET;
//Attempt to connect to the first address returned by
//the call to getaddrinfo
ptr = result;
do{
//Create a socket for connecting to the server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if(ConnectSocket == INVALID_SOCKET){
ptr = ptr->ai_next;
continue;
}
//Connect to server
iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if(iResult != SOCKET_ERROR){
break;
} else {
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
ptr = ptr->ai_next;
}
} while(ptr != NULL);
freeaddrinfo(result);
if(ConnectSocket == INVALID_SOCKET){
working = false;
WSACleanup();
return 1;
}
return 0;
}
然后程序执行代码以生成要发送给跟踪器的消息。对于 vector 中的每个跟踪器类,它的 trackerSend 函数都被消息调用,这里是 trackerSend 函数:
int trackerSocket::trackerSend(string getParams){
int iResult;
ostringstream os;
os << "GET " << page << getParams << " HTTP/1.1\r\n"
<< "Host: " << address << "\r\n"
<< "Accept: text/html\r\n"
<< "\r\n";
string sendBuf = os.str();
//Send tracker request
iResult = send(ConnectSocket, sendBuf.c_str(), strlen(sendBuf.c_str()), 0);
if(iResult == SOCKET_ERROR){
working = false;
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
return 0;
}
每次程序运行时,发送函数都会为每个跟踪器返回 -1。如果我调用 WSAGetLastError() 函数,它会返回 10093。此错误的 msdn 定义是:
尚未执行成功的 WSAStartup。应用程序未调用 WSAStartup 或 WSAStartup 失败。应用程序可能正在访问当前事件任务不拥有的套接字(即,试图在任务之间共享套接字),或者 WSACleanup 被调用了太多次。
我看不到 WSACleanup 被调用了太多次,所以我只能假设套接字不属于当前事件任务(不知道那是什么意思),任何人都可以看到问题吗?
这是主程序的一些代码(我在上面已经描述过了):
//Store tracker URL's in vector
vector<trackerSocket> trackers;
trackerSocket *temptracker = new trackerSocket();
iResult = temptracker->trackerInitialize(announce);
if(iResult == 0){
trackers.push_back(*temptracker);
}
if(announcelist != NULL){
i = 0;
while(announcelist[i]){
if(strcmp(announcelist[i]->val.l[0]->val.s, announce.c_str()) != 0){
temptracker = new trackerSocket();
iResult = temptracker->trackerInitialize(announcelist[i]->val.l[0]->val.s);
if(iResult == 0){
trackers.push_back(*temptracker);
}
}
i++;
}
}
//Check that at least one of the tracker URL's was valid
if(trackers.size() == 0){
printf("None of the tracker URL's provided were valid.\n");
return 1;
}
//Generate some required values
string peerid = genPeerID();
string peerport = "12345";
int uploaded = 0;
int downloaded = 0;
//Work out how many bytes are left to download
int left = 0;
if(singlefile){
left = length;
} else {
for(i = 0; i < filesinfo.size(); i++){
left += filesinfo[i].length;
}
}
//Send GET Request to tracker
i = 0;
ostringstream os;
string getParams;
string response;
os << "info_hash=" << infohash << "&peer_id=" << peerid << "&port=" << peerport <<
"&uploaded=" << uploaded << "&downloaded=" << downloaded << "&event=started";
getParams = os.str();
do{
iResult = trackers[i].trackerSend(getParams);
if(iResult != 0){
printf("trackerSend %d failed: %d\n", i, iResult);
i++;
continue;
}
} while(i < trackers.size());
最佳答案
根据您的代码,您不应在发送时调用 WSACleanup,如果一个跟踪器无法发送,您将减少内部计数器,如果它达到 0,系统将需要一个您未调用的新 WSAStartup...
我建议您只调用一次 WSAStartup(例如在应用程序开始时)和一次 WSACleanup。 (例如申请结束)
关于c++ - Winsock 发送失败,错误 10093,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11649259/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!