windows网络编程(六)——重叠I/O模型
来源:互联网 发布:数据库原理及应用试题 编辑:程序博客网 时间:2024/05/16 10:53
——————————————————————————————————————————————————————————————————————————
简单的接收和发送信息:
1.接收:
#include <stdio.h>#include <stdlib.h>#include <winsock2.h>#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll #define BUF_SIZE 1024void ErrorHandling(char *message);int main(int argc, char* argv[]){WSADATA wsaData;SOCKET hLisnSock, hRecvSock;SOCKADDR_IN lisnAdr, recvAdr;int recvAdrSz;WSABUF dataBuf;WSAEVENT evObj;WSAOVERLAPPED overlapped;char buf[BUF_SIZE];//DWORD recvBytes = 0, flags = 0;LPDWORD recvBytes = (LPDWORD)malloc(sizeof(DWORD));;DWORD flags = 0;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)ErrorHandling("WSAStartup() error!");hLisnSock = WSASocket(PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);memset(&lisnAdr, 0, sizeof(lisnAdr));lisnAdr.sin_family = AF_INET;lisnAdr.sin_addr.s_addr = htonl(INADDR_ANY);lisnAdr.sin_port = htons(1234);if (bind(hLisnSock, (SOCKADDR*)&lisnAdr, sizeof(lisnAdr)) == SOCKET_ERROR)ErrorHandling("bind() error");if (listen(hLisnSock, 5) == SOCKET_ERROR)ErrorHandling("listen() error");recvAdrSz = sizeof(recvAdr);hRecvSock = accept(hLisnSock, (SOCKADDR*)&recvAdr, &recvAdrSz);evObj = WSACreateEvent();memset(&overlapped, 0, sizeof(overlapped));overlapped.hEvent = evObj;dataBuf.len = BUF_SIZE;dataBuf.buf = buf;if (WSARecv(hRecvSock, &dataBuf, 1, recvBytes,&flags, &overlapped, NULL)== SOCKET_ERROR){if (WSAGetLastError()==WSA_IO_PENDING){puts("Background data receive");WSAWaitForMultipleEvents(1, &evObj, TRUE, WSA_INFINITE, FALSE);WSAGetOverlappedResult(hRecvSock, &overlapped, recvBytes, FALSE, NULL);}else{ErrorHandling("WSARecv() error");}}printf("Received message: %s \n", buf);WSACloseEvent(evObj);closesocket(hRecvSock);closesocket(hLisnSock);WSACleanup();free(recvBytes);return 0;}void ErrorHandling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);}
2.发送:
#include <stdio.h>#include <stdlib.h>#include <winsock2.h>void ErrorHandling(char *msg);#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll int main(int argc, char *argv[]){WSADATA wsaData;SOCKET hSocket;SOCKADDR_IN sendAdr;WSABUF dataBuf;char msg[] = "Network is Computer!";LPDWORD sendBytes = (LPDWORD)malloc(sizeof(DWORD));DWORD flags = 0;WSAEVENT evObj;WSAOVERLAPPED overlapped;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)ErrorHandling("WSAStartup() error!");hSocket = WSASocket(PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);memset(&sendAdr, 0, sizeof(sendAdr));sendAdr.sin_family = AF_INET;sendAdr.sin_addr.s_addr = inet_addr("127.0.0.1");sendAdr.sin_port = htons(1234);if (connect(hSocket, (SOCKADDR*)&sendAdr, sizeof(sendAdr)) == SOCKET_ERROR)ErrorHandling("connect() error!");evObj = WSACreateEvent();memset(&overlapped, 0, sizeof(overlapped));overlapped.hEvent = evObj;dataBuf.len = strlen(msg) + 1;dataBuf.buf = msg;if (WSASend(hSocket, &dataBuf, 1, sendBytes, flags, &overlapped, NULL)== SOCKET_ERROR){if (WSAGetLastError() == WSA_IO_PENDING){puts("Background data send");WSAWaitForMultipleEvents(1, &evObj, TRUE, WSA_INFINITE, FALSE);WSAGetOverlappedResult(hSocket, &overlapped, sendBytes, FALSE, NULL);}else{ErrorHandling("WSASend() error");}}printf("Send data size: %d \n", *sendBytes);WSACloseEvent(evObj);closesocket(hSocket);WSACleanup();free(sendBytes);return 0;}void ErrorHandling(char *msg){fputs(msg, stderr);fputc('\n', stderr);exit(1);}
3.结果:
阅读全文
0 0
- windows网络编程(六)——重叠I/O模型
- Windows下重叠I/O模型 网络编程
- windows网络编程之重叠模型(OVERLAPPED I/O)基础知识
- windows网络编程(七)——重叠I/O模型中的问题——WSARecv函数出现WSAEFAULT错误应该怎么解决?
- windows网络编程(八)——重叠I/O+多线程实现简单的聊天(windows服务器端 windows客户端)
- 随笔——重叠I/O模型的编程框架
- windows网络编程(五)——异步通知I/O模型
- Windows 网络编程(2)--重叠I/0模型
- Windows下重叠I/O模型
- Windows下重叠I/O模型
- Windows下重叠I/O模型
- Windows下重叠I/O模型(转)
- Windows下重叠I/O模型
- Windows下重叠I/O模型
- Windows下重叠I/O模型
- Windows下重叠I/O模型
- Windows下重叠I/O模型
- Windows下重叠I/O模型
- iOS动画 CABaseAnimation总结
- 设计模式------代理模式
- DS.SIMULIA.SIMPACK
- maven项目打jar包时包含依赖
- 汉堡
- windows网络编程(六)——重叠I/O模型
- 东芝光耦TLP785GB去哪里买呢
- 编码格式简介
- java NIO系列教程(二)
- Thinking in java-12 数据作用域问题
- Java 自定义类里面的对象自动赋初值
- 时间戳和日期互相转换
- 踩坑之_绑定远程服务
- ffmpeg+sdl播放类