简单的 winsocket TCP通信
2016-03-05 14:53
525 查看
//服务器 #include<iostream> #include<WinSock2.h> // socket 所需要的头文件 #pragma comment(lib,"WS2_32.lib")// link socket 库 #define PORT 9999 #define BUFLEN 1024 using namespace std; int main() { WSADATA wsaData; // 1 启动并初始化winsock(WSAStarup) if (WSAStartup(MAKEWORD(2, 2), &wsaData))//成功返回0 { return FALSE; } //2 创建套接字(socket) SOCKET sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(INVALID_SOCKET == sServer) { WSACleanup(); return FALSE; } //3 准备通信地址 SOCKADDR_IN addrServer; addrServer.sin_family = AF_INET; addrServer.sin_port = htons(PORT); addrServer.sin_addr.s_addr = INADDR_ANY;//任意可用地址 //4 绑定地址与socket(bind) if (SOCKET_ERROR==bind(sServer, (const sockaddr*)&addrServer, sizeof(SOCKADDR_IN))) { closesocket(sServer); WSACleanup(); return FALSE; } //5 监听 (listen) if (SOCKET_ERROR == listen(sServer, SOMAXCONN)) { closesocket(sServer); WSACleanup(); } // 6 等待客户端连接(accpet) sockaddr_in addrClient; int addrClientLen = sizeof(addrClient); cout << "服务器启动成功,等待客户端连接中。。。。" << endl; SOCKET sClient = accept(sServer, (sockaddr *)&addrClient, &addrClientLen); if (INVALID_SOCKET == sClient) { cout << WSAGetLastError() << endl; closesocket(sServer); closesocket(sClient); WSACleanup(); return FALSE; } //7 接收数据(recv) char recvBuf[BUFLEN]; ZeroMemory(recvBuf, sizeof(recvBuf)); if (SOCKET_ERROR == recv(sClient, recvBuf, sizeof(recvBuf), 0)) { closesocket(sServer); closesocket(sClient); WSACleanup(); return FALSE; } cout << "客户端(" << inet_ntoa(addrClient.sin_addr) << ":" << addrClient.sin_port << "):" << recvBuf << endl; //8 发送数据 char sendBuf[BUFLEN] = "你好客户端!"; if (SOCKET_ERROR==send(sClient, sendBuf, sizeof(sendBuf), 0)) { closesocket(sServer); closesocket(sClient); WSACleanup(); return FALSE; } system("pause"); system("pause"); return TRUE; } /* 注:1:MAKEWORD把参数组成一个WORD(双字节)类型数据并返回这个WORD类型数值,高位代表(修订本)号,低位字节指定主版本号(其代表) 2:socket(AF_INET,//The Internet Protocol version 4 (IPv4) address family SOCK_STREAM,//, two-way,This socket type uses the Transmission Control Protocol (TCP) for the Internet address family (AF_INET or AF_INET6). IPPROTO_TCP//The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_STREAM. ) */
//客户端 #include<iostream> #include<WinSock2.h> #pragma comment(lib,"WS2_32.lib") using namespace std; #define BUFLEN 1024 #define PORT 9999 void getIP(char*szHostaddress); int main() { WSADATA wsaData; // 1 启动并初始化winsock(WSAStarup) if (WSAStartup(MAKEWORD(2, 2), &wsaData))//成功返回0 { return FALSE; } //2 创建套接字(socket) SOCKET sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == sHost) { closesocket(sHost); WSACleanup(); return FALSE; } //3 准备通信地址 char szHostaddress[200]; getIP(szHostaddress); SOCKADDR_IN addrServer; addrServer.sin_family = AF_INET; addrServer.sin_port = htons(PORT); addrServer.sin_addr.s_addr = inet_addr(szHostaddress); //4 连接服务器(connect) if (SOCKET_ERROR == connect(sHost, (const sockaddr*)&addrServer, sizeof(addrServer))) { closesocket(sHost); WSACleanup(); return FALSE; } //5 发送数据 (send) char sendBuf[BUFLEN] = "你好服务器!"; if (SOCKET_ERROR == send(sHost, sendBuf, sizeof(sendBuf), 0)) { closesocket(sHost); WSACleanup(); return FALSE; } cout << "客户端发送消息成功!" << endl; //7 接收数据(recv) char recvBuf[BUFLEN]; ZeroMemory(recvBuf, sizeof(recvBuf)); if (SOCKET_ERROR == recv(sHost, recvBuf, sizeof(recvBuf), 0)) { closesocket(sHost); WSACleanup(); return FALSE; } cout << "服务器发来的消息:" <<recvBuf<< endl; system("pause"); } void getIP(char*szHostaddress){ char szHostname[100]; if (gethostname(szHostname, sizeof(szHostname)) != SOCKET_ERROR)//先得到主机名 { HOSTENT *pHostEnt = gethostbyname(szHostname);//通过名字拿到地址 if (pHostEnt != NULL) { sprintf(szHostaddress, "%d.%d.%d.%d", (pHostEnt->h_addr_list[0][0] & 0x00ff), (pHostEnt->h_addr_list[0][1] & 0x00ff), (pHostEnt->h_addr_list[0][2] & 0x00ff), (pHostEnt->h_addr_list[0][3] & 0x00ff)); } } else return; }
相关文章推荐
- Linux(Centos)中tcpdump参数用法详解(转)
- OkHttp的使用
- TCP面向连接中的“连接”究竟是什么,可靠与不可靠(转)
- TCp/IP实验一
- 自写网络流24题总结
- AFNetworking使用
- TCP/IP四层模型
- 网络端口
- Linux学习之路——网络基础知识点汇总
- 自定义BroadcastReceiver使用监听网络状态变化
- javax.servlet.http.HttpSession session用法详解
- HttpSession详解
- IHttpModule在webconfig中的注册
- IIS 多站点HTTPS加密及自动http跳转到https
- HTTP协议以及版本
- 卷积神经网络
- 2016太原网络营销师讲百度竞价(SEM)如何设计百度网盟账户?
- 一种网络用户行为日志自动获取方法
- 交叉编译tcpdump
- linux程序设计(套接字)+TCP/IP网络编程学习笔记