- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用winsock 连接到远程服务器。我成功连接了套接字,但是当我尝试使用 select 获取套接字详细信息时,它说套接字不存在(WSAENOTSOCK)。
注意:我正在将这段代码作为 Visual studio win 控制台应用程序执行,我的操作系统是 Windows 8。
我的代码(假设代码执行从 run_client 函数开始,并且测试结构具有所有选项)。另外,函数位于不同的文件中,因此我需要多次调用 WSAStartup
#define _CRT_SECURE_DEPRECATE_MEMORY
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <signal.h>
#include <sys/types.h>
#include <Winsock2.h>
#include <memory.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
int run_client(struct test * test)
{
int startup;
int result = 0;
fd_set read_set, write_set, excep_fd;
struct timeval now;
struct timeval* timeout = NULL;
struct iperf_stream *sp;
FD_ZERO(&excep_fd);
if (soc_connect(test) < 0)
return -1;
printf("Run client : success in making socket\n");
memcpy(&read_set, &test->read_set, sizeof(fd_set));
memcpy(&write_set, &test->write_set, sizeof(fd_set));
int iResult;
WSADATA wsaData;
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return -1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return -1;
}
else
{
printf("The Winsock 2.2 dll was found okay\n");
}
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
result = select(test->ctrl_sck + 1, &read_set, 0, 0, &tv);
if (SOCKET_ERROR == result)
{
switch (WSAGetLastError())
{
case WSANOTINITIALISED:
printf("select_result error : WSANOTINITIALISED\n");
break;
case WSAEFAULT:
printf("select_result error : WSAEFAULT\n");
break;
case WSAENETDOWN:
printf("select_result error : WSAENETDOWN\n");
break;
case WSAEINTR:
printf("select_result error : WSAEINTR\n");
break;
case WSAEINPROGRESS:
printf("select_result error : WSAEINPROGRESS\n");
break;
case WSAENOTSOCK:
printf("select_result error : WSAENOTSOCK\n");
break;
default:
printf("select_result errors : %d\n", WSAGetLastError());
break;
}
i_errno = WSAGetLastError();
closesocket(test->ctrl_sck);
WSACleanup();
return -1;
}
else if (result == 0)
{
printf("select_result : timeout : %d\n", result);
WSACleanup();
return -1;
}
else
{
WSACleanup();
}
}
int soc_connect(struct test *test)
{
FD_ZERO(&test->read_set);
FD_ZERO(&test->write_set);
printf("Making cookie\n");
make_cookie(test->cookie);
printf("Success in Making cookie\n");
/* Create and connect the control channel */
if (test->ctrl_sck < 0)
{
test->ctrl_sck = netdial(test->settings->domain, Ptcp, test->bind_address, 0, test->server_hostname, test->server_port);
}
if (test->ctrl_sck < 0) {
i_errno = IECONNECT;
return -1;
}
FD_SET(test->ctrl_sck, &test->read_set);
return 0;
}
void make_cookie(char *cookie)
{
static int randomized = 0;
char hostname[500];
struct timeval tv;
char temp[1000];
if ( ! randomized )
srand((int) time(0) ^ getpid());
(void) gethostname(hostname, sizeof(hostname));
(void) gettimeofday(&tv, 0);
(void) snprintf(temp, sizeof(temp), "%s.%ld.%06ld.%08lx%08lx.%s", hostname, (unsigned long int) tv.tv_sec, (unsigned long int) tv.tv_usec, (unsigned long int) rand(), (unsigned long int) rand(), "1234567890123456789012345678901234567890");
memcpy(cookie, temp, 36);
cookie[36] = '\0';
}
int netdial(int domain, int proto, char *local, int local_port, char *server, int port)
{
struct addrinfo hints, *local_res = NULL, *server_res = NULL;
int s;
WSADATA wsaData;
int iResult;
INT iRetval;
char port_str[6];
snprintf(port_str, 6, "%d", port);
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return -1;
}
if (local) {
memset(&hints, 0, sizeof(hints));
hints.ai_family = domain;
hints.ai_socktype = proto;
if (getaddrinfo(local, port_str, &hints, &local_res) != 0)
{
WSACleanup();
printf("Net dial : 0\n");
return -1;
}
}
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = domain;
hints.ai_socktype = proto;
hints.ai_protocol = IPPROTO_TCP;
if (getaddrinfo(server, port_str, &hints, &server_res) != 0)
{
WSACleanup();
return -1;
}
s = socket(server_res->ai_family, server_res->ai_socktype, server_res->ai_protocol);
if (s == INVALID_SOCKET) {
if (local)
{
if (local_res != NULL)
freeaddrinfo(local_res);
}
freeaddrinfo(server_res);
WSACleanup();
return -1;
}
printf("Socket created\n");
if (local) {
if (local_port) {
printf("Net dial : 3\n");
struct sockaddr_in *lcladdr;
lcladdr = (struct sockaddr_in *)local_res->ai_addr;
lcladdr->sin_port = htons(local_port);
local_res->ai_addr = (struct sockaddr *)lcladdr;
}
if (bind(s, (struct sockaddr *) local_res->ai_addr, local_res->ai_addrlen) < 0) {
_close(s);
WSACleanup();
freeaddrinfo(local_res);
freeaddrinfo(server_res);
printf("Net dial : 4\n");
return -1;
}
freeaddrinfo(local_res);
}
iResult = connect(s, server_res->ai_addr, (int)server_res->ai_addrlen);
if (iResult == SOCKET_ERROR) {
closesocket(s);
s = INVALID_SOCKET;
}
freeaddrinfo(server_res);
if (s == INVALID_SOCKET) {
WSACleanup();
return -1;
}
printf("Socket connected\n");
WSACleanup();
return s;
}
输出
Making cookie
Success in Making cookie
Socket created
Socket connected
Run client : success in making socket
The Winsock 2.2 dll was found okay
select_result errors : WSAENOTSOCK
我已经用谷歌搜索了这个问题并尝试了很多解决方案,但我找不到适合我的解决方案。请问有哪位可以帮忙吗?
最佳答案
functions are in different files, so i need to call WSAStartup multiple times
不,你不知道。这是你的捏造。您需要在进程开始时调用 WSAStartup()
一次,并在进程结束时调用 WSACleanup()
一次。
我无法想象你是如何或从哪里得到这个想法的,但它是错误的。 Winsock 既不知道也不关心您有多少个 .c 文件。
关于c - Windows C套接字: select() gives WSAENOTSOCK error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37612275/
在 的 React 组件中菜单,我需要设置selected反射(reflect)应用程序状态的选项的属性。 在 render() , optionState从状态所有者传递给 SortMenu 组件
我是初级 Ruby-mysql 程序员,我想知道如何使我的(存储过程)查询结果更快.. 这是我的存储过程我正在使用 SQL_CACHE.. 但我不确定.. 缓存使我的过程更快.. : ( DROP
我一直在 Python 中进行套接字编程,以使用 select.select(rfile, wfile, xlist[, timeout]) 处理由已连接的客户端套接字列表发出的请求,并且我还想用 J
我试图通过用空格填充文本来创建下拉列表中的列效果,如下例所示: [Aux1+1] [*] [Aux1+1] [@Tn=PP] [Main] [*] [Main A
我为 MySQL 编写了以下查询: SELECT subquery.t1_column1, subquery.t2_id, MAX(subquery.val) FROM ( S
为什么我们要用 select 标签来编写.attr('selected','selected') 例如: $('#countryList option').filter(function () {
Lokalizacja: Gdańsk Rzeszów Wrocław 不知道发生了什么,但在那种情况下没有选择的选项,我必须从列表中选择一些东西。当我从选
我的表单中有两个选择字段。第一个是单选,另一个是多选。现在我想做的是根据单选中所选的选项,使用给定的数据选择多选中的选项。为此,我在单选更改时触发 ajax 请求: $.ajax({ type
我在 Firefox 5 中发现了一个奇怪的错误(我现在无法访问 4)。但是,我认为它可能在 Firefox 4 中工作,因为我刚买了一台新电脑,而且我不记得以前见过这个错误。 我有几个选择框。所选值
此 SQL 有何不同: 第一个: select * from table_1 a join table_2 b on a.id = b.acc_id 第二个: select * f
预选 的最佳做法是什么?在 ? 根据不同的网站,两者都有效。但是哪个更好呢?最兼容? Foo Bar 最佳答案 如果您正在编写 XHTML,则 selected="selected" 是必需的。 如
我使用 Angular JS 创建了一个多选选择框:下面是相同的代码: JS: $scope.foobars = [{ 'foobar_id': 'foobar01', 'name':
我在 jqGrid 中有几列 edittype="select"。如何读取特定行中当前选定值的选项值? 例如:当我提供以下选项时,如何获得 FedEx 等的“FE” editoption: { val
这是我更大问题的精简查询,但要点是我试图内部联接到一个选择,其中选择受到外部选择的限制。那可能吗?我在内部选择上收到有关多部分标识符 S.Item 和 S.SerialNum 的错误。 要点是这样的,
如果chat.chat_type IS NULL,我想选择user.*,但如果chat.chat_type = 1 我想选择组。* SELECT CASE WHEN ch
我正在编写一个小脚本来测试表单在提交之前是否已被更改。所以我可以使用普通输入(文本、文本区域等): if(element.defaultValue != element.value) { al
我正在尝试为 Prototype 编写一个插件,用户在其中单击下拉菜单并将其替换为多选元素。我快完成了。在用户选择他们想要显示的内容并将表单提交到同一页面之前,一切都很好。我正在使用 PHP 来使用
你如何在 MongoDB 中进行嵌套选择,类似于 SELECT id FROM table1 WHERE id IN (SELECT id FROM table2) 最佳答案 MongoDB 尚不具备
我有以下用于选择下拉列表的代码: {{unit.Text}} UnitOfMeasurements 数组中的每一项看起来像这样: Selected: false Text: "lb" Va
我正在尝试使用[选定]和[ngValue]来设置表单中包含对象的选择标记的默认值。但出于某种原因,它们似乎无法相提并论。。示例代码:。这段代码最终只显示空白作为缺省值。如果删除[ngValue],它就
我是一名优秀的程序员,十分优秀!