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

客户端代码:

#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;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值