我正在尝试使用以下代码处理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上没有管理权限,我无法注册一些自定义库.任何人都可以告诉我,我哪里错了?
我正在开发一个类似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选项,所以我不能说这是不同的.
我正在将一个通信库从Linux移植到Windows.我知道我的方法在很大程度上是什么.该库使用所有原始以太网级别帧进行所有通信.
我移植的库使用PF_PACKET族和struct sockaddr_ll.浏览MSDN winsock站点后,我还没有找到一个等效的系列/结构.我的方法应该在这里?
我有一些想法,但我不确定它们是否是好主意我可以使用PF_UNSPEC,未指定.我可以传递PF_PACKET表示的数字(它是一个无符号的短)我也可以在Windows中创建自己的sockadddr_ll结构.
这些想法对我来说都不好看,它们看起来就像是不太可能有效的黑客.
如果有人有任何建议,我将不胜感激.
可以通过atExit函数注册WSACleanup吗?我们有几个应用程序可以在代码中的不同点终止,因此我们希望避免在代码中将WSACleanup放在任何地方.我们可以通过DllMain调用WSAStartup/WSACleanup,因为我们有一个所有这些应用程序都使用的dll.但是,Microsoft严格建议不要通过DllMain使用WSAStartup/WSACleanup,因为这会导致死锁.我们可以将WSAStarup移出DllMain,并在访问Windows套接字库之前在所有应用程序的代码中的某一点调用它.而且,只要我们调用WSAStartup,我们就想使用atExit函数来注册对WSACleanup的调用.有没有人有这种方法的经验?谢谢!
如果使用CreateProcessWithLogonW或CreateProcessAsUserW创建进程,则使用我自己的程序或其他程序在调用时无法运行winsock。创建套接字时,它将返回此错误:
Run Code Online (Sandbox Code Playgroud)WSAEPROVIDERFAILEDINIT 10106服务提供商初始化失败。
Run Code Online (Sandbox Code Playgroud)The requested service provider could not be loaded or initialized.如果无法加载服务提供商的DLL(LoadLibrary失败)或提供商的WSPStartup或NSPStartup函数失败,则返回此错误
。
但是,WSAStartup似乎没有错误。只需使用WSASocket创建套接字即可返回此结果。
更新:
错误:
LoadUserProfile:错误代码2。找不到指定的文件
AdjustTokenPrivs:错误代码5。访问被拒绝
我在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
谢谢
我有一个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. …
如果我想从1个线程调用服务器套接字上的closesocket(),它是否与使用相同服务器套接字运行服务器的另一个线程分开,是否安全?
最近,我们的整个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) 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) winsock ×10
c++ ×5
windows ×5
sockets ×3
networking ×2
udp ×2
wsastartup ×2
atexit ×1
c ×1
c# ×1
events ×1
excel ×1
excel-vba ×1
hyper-v ×1
linux ×1
multicast ×1
playstation ×1
port ×1
porting ×1
recv ×1
vba ×1
visual-c++ ×1
winapi ×1
wsacleanup ×1
xbox360 ×1