请问你一个socket通信的问题?
- C/C++ code
WSADATA wsa; ::WSAStartup(0x1010,&wsa); SOCKET client; client=::socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); sockaddr_in sockin; sockin.sin_family=AF_INET; sockin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); sockin.sin_port=htons(6090); int ret=::connect(client,(LPSOCKADDR)&sockin,sizeof(sockaddr_in)); if (SOCKET_ERROR==ret) { cout<<"连接服务器失败"<<endl; ::WSACleanup(); } char buf[1024]="10000"; ret=::send(client,buf,sizeof(buf),0); if (SOCKET_ERROR==ret) { cout<<"失败"<<endl; } Sleep(2000); ret=::send(client,buf,sizeof(buf),0); if (SOCKET_ERROR==ret) { cout<<"失败"<<endl; } cout<<WSAGetLastError();我的服务端是I/O模式的,我用上面代码向服务端发送数据,怎么只收到第一个send的数据?
[解决办法]
你的服务端读取了几次数据?
你的服务端代码呢?
[解决办法]
服务端代码呢?
[解决办法]
[解决办法]
这是神马语言。。。WINDOWS好复杂。
[解决办法]
你都发送数据了,为什么又只接收第一次的数据呢?
如果不想让服务器收到,可以不发,或者服务端收到不处理
[解决办法]
感觉是你的信号量hSemaphore没有重置,卡在那里了
[解决办法]
你两次 send发的都一样。。你怎么知道发的是第一次呢??
[解决办法]
淡定....
[解决办法]
每次accept(建立一个连接)后,才release一个信号量。
而每次GetQueuedCompletionStatus(一次IO操作)前,要wait一个信号量。
获取和释放锁的次数不等吧
[解决办法]
代码里,每次send是1024个字节(字符串"10000",后面一串\0),打印下dwTrans,看看一次获取了多少字节。
BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,
LPDWORD lpNumberOfBytes,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED* lpOverlapped,
DWORD dwMilliseconds
);
第4个参数才是IO信息,代码里怎么比较第3个?
bool bOk=::GetQueuedCompletionStatus(hcom,&dwTrans,(PULONG_PTR)&pPerHandle,&pOverLapped,WSA_INFINITE);
switch(pPerHandle->nOperationType)