标签: winsock

VisualBasic中的MSWinsock.Winsock事件处理

我正在尝试使用以下代码处理Winsock_Connect事件(实际上我需要在Excel宏中使用它):

Dim Winsock1 As Winsock 'Object type definition

Sub Init()
    Set Winsock1 = CreateObject("MSWinsock.Winsock") 'Object initialization
    Winsock1.RemoteHost = "MyHost"
    Winsock1.RemotePort = "22"
    Winsock1.Connect

    Do While (Winsock1.State <> sckConnected)
        Sleep 200
    Loop
End Sub

'Callback handler
Private Sub Winsock1_Connect()
    MsgBox "Winsock1::Connect"
End Sub
Run Code Online (Sandbox Code Playgroud)

但它永远不会进入Winsock1_Connect子程序,尽管Winsock1.State是"已连接".我想使用标准MS库,因为我的PC上没有管理权限,我无法注册一些自定义库.任何人都可以告诉我,我哪里错了?

excel events vba winsock excel-vba

6
推荐指数
1
解决办法
2万
查看次数

winsock和linux套接字之间的区别

我正在开发一个类似FTP的程序,将大量小文件下载到Xbox 360 devkit(使用Winsock),并将其移植到Playstation3(也是一个devkit,并使用linux AFAIK).该程序使用BSD样式的套接字(TCP).两个程序都与同一服务器通信,下载相同的数据.该程序循环遍历循环中的所有文件,如下所示:

for each file
    send(retrieve command)
    send(filename)
    receive(response)
    test response
    receive(size)
    receive(data)

在Xbox 360实现上,整个下载需要1:27,最后一次发送和第一次接收之间的时间大约需要14秒.这对我来说似乎很合理.

对于相同的数据,Playstation3实现需要4:01.瓶颈似乎介于最后一次发送和第一次接收之间,占用了当时的3:43.网络和磁盘时间都明显少于Xbox 360.

这两个devkits都与我的PC处于同一个交换机上,后者执行文件服务,并且所述交换机上没有其他流量.

我试过设置TCP_NODELAY标志,这并没有显着改变.我也尝试将SO_SNDBUF/ 设置SO_RCVBUF为625KB,这也没有显着影响时间.

我假设Winsock和linux之间的TCP/IP堆栈实现之间存在差异; 是否有一些套接字选项,我可以设置使Linux实现更像Winsock?还有什么我不考虑的吗?

唯一的解决方案是重写它,以便它将所有文件请求一起发送,然后全部接收它们.

不幸的是,索尼的实现没有TCP_CORK选项,所以我不能说这是不同的.

sockets networking playstation winsock xbox360

6
推荐指数
1
解决办法
4786
查看次数

使用Winsock的原始以太网帧

我正在将一个通信库从Linux移植到Windows.我知道我的方法在很大程度上是什么.该库使用所有原始以太网级别帧进行所有通信.

我移植的库使用PF_PACKET族和struct sockaddr_ll.浏览MSDN winsock站点后,我还没有找到一个等效的系列/结构.我的方法应该在这里?

我有一些想法,但我不确定它们是否是好主意我可以使用PF_UNSPEC,未指定.我可以传递PF_PACKET表示的数字(它是一个无符号的短)我也可以在Windows中创建自己的sockadddr_ll结构.

这些想法对我来说都不好看,它们看起来就像是不太可能有效的黑客.

如果有人有任何建议,我将不胜感激.

linux windows networking porting winsock

6
推荐指数
1
解决办法
1万
查看次数

WSACleanup和atExit

可以通过atExit函数注册WSACleanup吗?我们有几个应用程序可以在代码中的不同点终止,因此我们希望避免在代码中将WSACleanup放在任何地方.我们可以通过DllMain调用WSAStartup/WSACleanup,因为我们有一个所有这些应用程序都使用的dll.但是,Microsoft严格建议不要通过DllMain使用WSAStartup/WSACleanup,因为这会导致死锁.我们可以将WSAStarup移出DllMain,并在访问Windows套接字库之前在所有应用程序的代码中的某一点调用它.而且,只要我们调用WSAStartup,我们就想使用atExit函数来注册对WSACleanup的调用.有没有人有这种方法的经验?谢谢!

c++ winsock atexit wsastartup wsacleanup

6
推荐指数
1
解决办法
3171
查看次数

为什么Windows在模拟其他用户时不允许WinSock启动

如果使用CreateProcessWithLogonW或CreateProcessAsUserW创建进程,则使用我自己的程序或其他程序在调用时无法运行winsock。创建套接字时,它将返回此错误:

WSAEPROVIDERFAILEDINIT 10106
Run Code Online (Sandbox Code Playgroud)

服务提供商初始化失败。

The requested service provider could not be loaded or initialized.
Run Code Online (Sandbox Code Playgroud)

如果无法加载服务提供商的DLL(LoadLibrary失败)或提供商的WSPStartup或NSPStartup函数失败,则返回此错误

但是,WSAStartup似乎没有错误。只需使用WSASocket创建套接字即可返回此结果。

更新:

错误:

LoadUserProfile:错误代码2。找不到指定的文件

AdjustTokenPrivs:错误代码5。访问被拒绝

c++ windows impersonation winsock wsastartup

6
推荐指数
2
解决办法
1535
查看次数

当使用Winsock读取所有信息时,结束"recv()"循环

我在winsock的recv()循环中遇到了问题.我试图在iResult == 0时终止循环,但是,循环仅在套接字关闭时结束.它似乎挂在最后一个recv(),其中iResult等于0.那么有关如何有效终止循环的任何想法?我的最终目标(无论iResult是否= 0;或许我的方法是错误的)是在读取所有发送的信息时停止循环.这是循环.

    do
    {
        iResult = recv(socket, recvbuf, BUFLEN-1, 0);
        if(iResult > 0){
            // Null byte :)
            // Remove that garbage >:(
            recvbuf[iResult] = '\0';
            printf("Recvbuf: %s\n\n\niResult: %d\n",recvbuf,iResult);
            continue; // working properly
        }
        else if(iResult == 0)
            // Connection closed properly
            break;
        else
        {
            printf("ERROR! %ld",WSAGetLastError());
            break;
        }
    } while(iResult > 0);
Run Code Online (Sandbox Code Playgroud)

就像我说的,我收到的所有数据,我都无法退出循环.下一步是将数据写回服务器,但它会挂起,直到ping超时.套接字是SOCK_STREAM,BUFLEN定义为0x200

谢谢

c++ windows winapi winsock recv

6
推荐指数
1
解决办法
6428
查看次数

Windows中UDP的C++头文件?

我有一个linux应用程序,它通过UDP协议发送数据.它使用这些头文件:

#include <stdio.h>
/* standard C i/o facilities */
#include <stdlib.h>
/* needed for atoi() */
#include <unistd.h>

/* defines STDIN_FILENO, system calls,etc */
#include <sys/types.h> /* system data type definitions */
#include <sys/socket.h> /* socket specific definitions */
#include <netinet/in.h> /* INET constants and stuff */
#include <arpa/inet.h> /* IP address conversion stuff */
#include <netdb.h>
#include <string.h> /* for string and memset etc */
/* gethostbyname */
#include <iostream>

#include <fstream>

#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <opencv/cxcore.h> 
Run Code Online (Sandbox Code Playgroud)

我想制作我的应用程序的WIndows版本.但是上面的一些头文件在WIndows中不起作用,特别是那些UDP. …

c++ sockets udp winsock visual-c++

6
推荐指数
3
解决办法
3万
查看次数

closesocket线程安全吗?

如果我想从1个线程调用服务器套接字上的closesocket(),它是否与使用相同服务器套接字运行服务器的另一个线程分开,是否安全?

c c++ windows client-server winsock

6
推荐指数
1
解决办法
1878
查看次数

Hyper-V机器上的套接字异常

最近,我们的整个QA环境从VMWare迁移到Hyper-V虚拟机.

我们的一个应用程序以每秒20K数据包的速率将UDP数据包发送到多播云.

虽然这在VMWare环境中运行良好,但Hyper-V使应用程序在几分钟的工作后抛出以下异常:

System.Net.Sockets.SocketException (0x80004005): An invalid argument was supplied
   at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
Run Code Online (Sandbox Code Playgroud)

在将套接字的发送缓冲区大小定义为1,000,000字节时,我还设法立即模仿了这个问题.

我该如何解决这个问题?

更新1:一旦发生异常,这是来自事件查看器的日志条目:

Faulting application name: Agent.exe, version: 1.0.12.7366, time stamp: 0x51389f69
Faulting module name: KERNELBASE.dll, version: 6.1.7601.18015, time stamp: 0x50b83c8a
Exception code: 0xe0434352
Fault offset: 0x0000c41f
Faulting process id: 0xaf0
Faulting application start time: 0x01ce1b4ce509dc7a
Faulting application path: C:\Users\DevUser\Desktop\QA\Agent.exe
Faulting module path: C:\Windows\syswow64\KERNELBASE.dll
Report Id: d2b45dce-8740-11e2-86f9-00155d022804
Run Code Online (Sandbox Code Playgroud)

更新2:UDP数据包的大小为100-200字节.

更新3:这是有问题的代码:

    m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    m_socket.Ttl = 1; …
Run Code Online (Sandbox Code Playgroud)

c# udp hyper-v multicast winsock

6
推荐指数
1
解决办法
638
查看次数

为什么套接字connect()到它自己的短暂端口?

connect()如果我使用自动分配的临时端口(5000-65534)范围内的端口连接到localhost,我可以可靠地获得一个Winsock套接字.具体来说,Windows似乎有一个系统范围的滚动端口号,它将尝试将其指定为客户端套接字的本地端口号.如果我创建套接字直到分配的数字刚好低于我的目标端口号,然后重复创建套接字并尝试连接到该端口号,我通常可以让套接字连接到自己.

我首先在一个重复尝试连接到localhost上的某个端口的应用程序中发生这种情况,当服务没有监听时,它很少成功建立连接并接收它最初发送的消息(恰好是Redis PING命令).

一个例子,在Python中(无需监听目标端口即可运行):

import socket

TARGET_PORT = 49400

def mksocket():
    return socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)

while True:
    sock = mksocket()
    sock.bind(('127.0.0.1', 0))
    host, port = sock.getsockname()
    if port > TARGET_PORT - 10 and port < TARGET_PORT:
        break
    print port

while port < TARGET_PORT:
    sock = mksocket()
    err = None
    try:
        sock.connect(('127.0.0.1', TARGET_PORT))
    except socket.error, e:
        err = e
    host, port = sock.getsockname()
    if err:
        print 'Unable to connect to port %d, used local port %d: %s' % (TARGET_PORT, …
Run Code Online (Sandbox Code Playgroud)

sockets windows port winsock

6
推荐指数
1
解决办法
1929
查看次数