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.结果:



原创粉丝点击