您的位置:首页 > 理论基础 > 计算机网络

win32网络编程实例——重叠IO

2016-11-07 14:48 351 查看
客户端代码:

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")

int main()
{
//WSAStartup()用到
WSADATA wsaData;

//WSASend()用到
WSABUF wsaBuf;
unsigned int numOfBytesSent = 0;
char sendbuf[1024]="HelloWorld!";
int flags = 0;//WSASend()的第5个参数,直接填0,与WSARecv()的第5个参数不同,这个参数填&flag
WSAOVERLAPPED wsaOverLapped;//不能向此变量内的元素传递NULL,否则WSASend()第一个参数所指向的句柄会以阻塞方式进行,违背重叠IO的初衷
WSAEVENT evObj;//WSAOVERLAPPED 结构体只需要填写最后一个参数,uEvent即可

//WSASocket()用到
SOCKET connectSocket;

//bind()用到
struct sockaddr_in serverAddr;

WSAStartup(MAKEWORD(2,2),&wsaData);

connectSocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
if(INVALID_SOCKET
== connectSocket){
printf("WSASocket error :%d\n",WSAGetLastError());
WSACleanup();
closesocket(connectSocket);
return -1;
}

memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(27015);

if(connect(connectSocket,(SOCKADDR *)&serverAddr,sizeof(serverAddr))
== SOCKET_ERROR){
printf("connect error :%d\n",WSAGetLastError());
WSACleanup();
closesocket(connectSocket);
return -1;
}//其实connect的作用只是让远端使用accept建立acceptsocket而已

wsaBuf.buf = sendbuf;
wsaBuf.len = 1024;
evObj = WSACreateEvent();
wsaOverLapped.hEvent = evObj;
if(WSASend(connectSocket,&wsaBuf,1,&numOfBytesSent,0,&wsaOverLapped,NULL)
== SOCKET_ERROR){
if(WSAGetLastError() == WSA_IO_PENDING)
printf("background data send\n");
else
printf("WSASend() error :%d\n",WSAGetLastError());

}
printf("numOfBytesSent is %d\n",numOfBytesSent);

WSACleanup();
closesocket(connectSocket);
return 0;
}

服务器端代码:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "Ws2_32.lib")

int main()
{
WSADATA wsaData;

WSABUF wsaBuf;
WSAOVERLAPPED wsaOverLapped;
WSAEVENT evObj;
int flags = 0 ;//WSARecv()的第5个参数,这个参数填&flag,而WSASend()的第5个参数直接填0
char recvBuf[1024] ={0};
unsigned int numOfBytesRecvd = 0;

SOCKET listenSocket = INVALID_SOCKET;
SOCKET acceptSocket = INVALID_SOCKET;
struct sockaddr_in serverAddr;

WSAStartup(MAKEWORD(2,2),&wsaData);

listenSocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
if(INVALID_SOCKET
== listenSocket){
printf("WSASocket error :%d\n",WSAGetLastError());
WSACleanup();
closesocket(listenSocket);
return -1;
}

memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(27015);
if(bind(listenSocket,(SOCKADDR *)&serverAddr,sizeof(serverAddr))
== SOCKET_ERROR){
printf("bind error :%d\n",WSAGetLastError());
WSACleanup();
closesocket(listenSocket);
return -1;
}

if(listen(listenSocket,SOMAXCONN)
== SOCKET_ERROR){
printf("listen error :%d\n",WSAGetLastError());
WSACleanup();
closesocket(listenSocket);
return -1;
}

acceptSocket = accept(listenSocket,NULL,NULL);
if(acceptSocket == INVALID_SOCKET){
printf("accept error :%d\n",WSAGetLastError());
WSACleanup();
closesocket(listenSocket);
closesocket(acceptSocket);
return -1;
}

printf("connect established!\n");

wsaBuf.buf = recvBuf;
wsaBuf.len = 1024;
evObj = WSACreateEvent();
wsaOverLapped.hEvent = evObj;
if(WSARecv(acceptSocket,&wsaBuf,1,&numOfBytesRecvd,&flags,&wsaOverLapped,NULL)
== SOCKET_ERROR)
{
if(acceptSocket == INVALID_SOCKET)printf("wsa acceptsocket invalidsocket\n");
if(WSAGetLastError() == WSA_IO_PENDING)
printf("background recv data\n");
else
{
printf("WSARecv error :%d\n",WSAGetLastError());
}
}
printf("numOfBytesRecvd is %d\n",numOfBytesRecvd);
printf("recv data is %s\n",wsaBuf.buf);

closesocket(listenSocket);
closesocket(acceptSocket);
WSACleanup();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: