WSACleanup 崩溃,以及使用注意

WSACleanup 在多线程多次调用会产生内存崩溃等现场发生!

由于程序模块其他对象正在使用网络库等操作,而此时如果调用WSACleanup 则一定会崩溃!

一般程序模块在启用的时候调用一次WSAStartup,退出时候调用WSACleanup ,DLL模块也是,这用就可以及时销毁网络资源

#include "stdafx.h" #include<iostream> #include<winsock2.h> #pragma comment(lib,"WS2_32.lib") #define BUF_SIZE 64 //缓冲区大小 int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsd; SOCKET sServer; SOCKET sAccept; SOCKET sClient; int retVal; char buf[BUF_SIZE]; //用于接受客户端数据的缓冲区 //初始化套接字动态库 if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { printf("WSAStartup failed !\n"); return 1; } printf("服务器初始化成功!\n"); //创建用于监听的套接字 sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET == sServer) { printf("scoket failed!\n"); WSACleanup(); return -1; } printf("服务器创建监听套接字成功!\n"); //设置服务器套接字地址 SOCKADDR_IN addrServ; addrServ.sin_family = AF_INET; addrServ.sin_port = htons(9990); //监听端口为9990 addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //绑定套接字sServer到本地地址,端口9990 retVal = bind(sServer,(const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN)); if(SOCKET_ERROR == retVal) { printf("bind failed !\n"); closesocket(sServer); WSACleanup(); return -1; } printf("服务器套接字地址绑定成功!\n"); //监听套接字 retVal = listen(sServer,3); if(SOCKET_ERROR == retVal) { printf("listen failed !\n"); closesocket(sServer); WSACleanup(); return -1; } printf("服务器已处于监听状态!\n"); //接受客户请求 sockaddr_in addrAccept; //客户端地址 int addrAcceptlen = sizeof(addrAccept); sAccept = accept(sServer,(sockaddr FAR*)&addrAccept,&addrAcceptlen); if(INVALID_SOCKET == sAccept) { printf("accept failed:%d!\n",GetLastError()); closesocket(sServer); WSACleanup(); return -1; } //printf("服务器已与一个客户端建立连接...\n"); //printf("服务器开始接收客户端数据...\n"); //ZeroMemory(buf,BUF_SIZE); //清空接收数据的缓冲区 //retVal=recv(sAccept,buf,BUF_SIZE,0); //注意不是BUF_SIZE,而是BUFSIZE //if (SOCKET_ERROR == retVal) //{ // printf("recv failed !\n"); // closesocket(sAccept); // closesocket(sServer); // WSACleanup(); // return -1; //} //printf("Recv Form Client [%s:%d]:%s\n",inet_ntoa(addrAccept.sin_addr),addrAccept.sin_port,buf); //服务器与客户端之间发送和接收数据 //循环接收客户端的数据,直接客户端发送quit命令后退出 while (true) {
03-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值