您的位置:首页 > 其它

流式套接字服务器端

2016-06-06 17:08 260 查看
/*** 时间:2016-6-6 下午* 说明:流式套接字服务端**/#include#include #include #include #include //链接到WinSock 2 对应的lib文件:Ws2_32.lib#pragma comment (lib, "Ws2_32.lib")#define DEFAULT_BUFLEN 512#define DEFAULT_PORT "27015"int main(){//预先声明的变量WSADATA wsaData;int iResult;SOCKET listenSocket = INVALID_SOCKET;//用于监听的套接字SOCKET clientSocket = INVALID_SOCKET;//提供给客户端的套接字,可改为多线程模式、struct addrinfo * result = NULL;struct addrinfo hints;int iSendResult;char recvbuf[DEFAULT_BUFLEN];int recvbuflen = DEFAULT_BUFLEN;//服务端建立:printf("服务器端\n");//1. 调用WSAStartup()函数加载WinSock.dllprintf("1. 调用WSAStartup()函数加载WinSock.dll\n");iResult=WSAStartup(MAKEWORD(2, 2), &wsaData);//加载动态库,成功则返回0,否则非0if(iResult != 0){printf("返回结果 %d:WinSock.dll 加载失败!\n",iResult);return 1;}else{printf("返回结果 %d:WinSock.dll 加载成功!\n",iResult);}//声明IPv4地址族,流式套接字,TCP协议ZeroMemory(&hints, sizeof(hints));hints.ai 4000 _family = AF_INET; //IPv4hints.ai_socktype = SOCK_STREAM; //流式套接字hints.ai_protocol = IPPROTO_TCP; //TCP协议hints.ai_flags = AI_PASSIVE; ////解析服务器地址和端口号iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);if(iResult != 0){printf("解析服务器地址和端口号失败!\n");WSACleanup();return 3;}//2. 调用socket()函数创建一个流式套接字,用于监听printf("2. 调用socket()函数创建一个流式套接字,用于监听\n");listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);if(listenSocket == INVALID_SOCKET){printf("创建监听套接字失败,错误:%ld\n",WSAGetLastError());freeaddrinfo(result);WSACleanup();return 4;}else{printf("创建监听套接字成功\n");}//3. 调用bind()函数绑定套接字与端口iResult = bind(listenSocket, result->ai_addr, (int)result->ai_addrlen);if(iResult == SOCKET_ERROR){printf("bind绑定失败,错误:%ld\n",WSAGetLastError());freeaddrinfo(result);WSACleanup();return 5;}else{printf("bind绑定成功\n");}freeaddrinfo(result);//4. 用listen函数监听连接请求iResult = listen(listenSocket, SOMAXCONN);if(iResult == SOCKET_ERROR){printf("监听出错:%ld\n",WSAGetLastError());freeaddrinfo(result);WSACleanup();return 6;}else{printf("监听成功\n");}//5. 用accept函数接受客户端请求,返回连接套接字clientSocketclientSocket = accept(listenSocket, NULL, NULL);if(clientSocket == INVALID_SOCKET){printf("接受出错:%ld\n",WSAGetLastError());freeaddrinfo(result);WSACleanup();return 7;}else{printf("建立连接成功\n");}//在不须要监听的情况下释放套接字closesocket(listenSocket);//接收客户端数据,直到对方关闭连接do{iResult = recv(clientSocket, recvbuf, recvbuflen, 0);if(iResult > 0){//case 1: 成功接受到数据printf("received: %s\n", recvbuf);//输出}else if(iResult == 0){//case 2: 连接关闭printf("连接关闭...\n");}else{//case 3: 连接出错printf("connect error : %d\n ",WSAGetLastError());closesocket(clientSocket);WSACleanup();return 8;}}while(iResult > 0);//关闭连接iResult = shutdown(clientSocket, SD_SEND);if(iResult == SOCKET_ERROR){printf("关闭连接失败\n");closesocket(clientSocket);WSACleanup();return 9;}//关闭套接字,释放资源closesocket(clientSocket); WSACleanup(); return 0 ;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: