流式套接字服务器端
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 ;}
相关文章推荐
- 基于Linux平台实现的流式套接字客户端服务器端代码
- 流式套接字客户端/服务器编程 (迭代服务器+并发服务器)
- TCP流式套接字的异步事件WSAAsyncSelect编程
- 流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较
- TCP流式套接字的select模式编程
- linux基础编程 套接字socket 完整的服务器端多线程socket程序【转】
- Unix学习笔记------套接字----服务器端函数
- 【网络编程】使用流式套接字实现简单的客户端/服务端通信过程
- socket套接字写的简单客服、服务器端
- Socket(套接字)在服务器端和客户端之间的基本工作原理
- Java套接字Socket编程-----服务器端和客户端
- 【网络编程】利用流式套接字实现文件传输实验
- Socket(套接字)在服务器端和客户端之间的基本工作原理
- 基于流式套接字的消息收发
- java学习笔记---qq项目---在服务器端建立的一个Socket数组来存储已建立连接套接字
- 网络编程:TCP流式套接字多线程通信
- C/S (TCP/IP,流式套接字)架构下的 因特网上语音实时传输方案的解决 (主要解决帧间延时缝隙带来的震颤和杂音问题)
- 流式套接字程序设计
- 服务器端的返回的套接字是不是客户端的套接字???
- linux基础编程 套接字socket 完整的服务器端多线程socket程序