Socket通信——Windows下,使用Winsock,C++
来源:互联网 发布:mac地址认证 编辑:程序博客网 时间:2024/05/18 00:49
MSDN上面关于Winsock部分
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740632(v=vs.85).aspx
本文的代码来自MSDN
服务器端代码
https://msdn.microsoft.com/en-us/library/windows/desktop/ms737593(v=vs.85).aspx
客户端代码
https://msdn.microsoft.com/en-us/library/windows/desktop/ms737591(v=vs.85).aspx
MSDN的例子还是很不错的,虽然是英文的,而且网站比较庞大,要善用搜索功能
Winsock编程和Linux下的编程是一致的,其实他们都是受Unix的影响
Socket()
Bind();
Listen();
Accept();
Read();/Write();
Close();
Winsock和Linux下编程的一个区别是
winsock要先调用WSAStartup()初始化Winsock
WSADATA 结构体包含了windows socket的实现信息
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
WSAStartup的参数MAKEWORD(2,2),表示请求2.2版本的Winsock,并且将这个版本设置为调用者可用的Windows Socket支持的最高版本
附代码
服务器端
#undef UNICODE#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <winsock2.h>#include <ws2tcpip.h>#include <stdlib.h>#include <stdio.h>// 需要链接库 Ws2_32.lib#pragma comment (lib, "Ws2_32.lib")// #pragma comment (lib, "Mswsock.lib")#define DEFAULT_BUFLEN 512#define DEFAULT_PORT "27015"int __cdecl main(void){ 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; // 初始化 Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; } ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // 解析服务器端口和地址 iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } // 创建服务器端口 ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; } // 设定监听套接字 iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen); if (iResult == SOCKET_ERROR) { printf("bind failed with error: %d\n", WSAGetLastError()); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); return 1; } freeaddrinfo(result); iResult = listen(ListenSocket, SOMAXCONN); if (iResult == SOCKET_ERROR) { printf("listen failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; } //接受客户端套接字 ClientSocket = accept(ListenSocket, NULL, NULL); if (ClientSocket == INVALID_SOCKET) { printf("accept failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; } // 不再需要服务器套接字 closesocket(ListenSocket); //接受消息直到对方关闭 do { iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); if (iResult > 0) { printf("Bytes received: %d\n", iResult); // 将消息返回给发送者 iSendResult = send( ClientSocket, recvbuf, iResult, 0 ); if (iSendResult == SOCKET_ERROR) { printf("send failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } printf("Bytes sent: %d\n", iSendResult); } else if (iResult == 0) printf("Connection closing...\n"); else { printf("recv failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } } while (iResult > 0); // 关闭连接 iResult = shutdown(ClientSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } //关闭套接字,释放资源 closesocket(ClientSocket); WSACleanup(); return 0;}
客户端
#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <winsock2.h>#include <ws2tcpip.h>#include <stdlib.h>#include <stdio.h>// 需要链接到3个库 Ws2_32.lib, Mswsock.lib, and Advapi32.lib#pragma comment (lib, "Ws2_32.lib")#pragma comment (lib, "Mswsock.lib")#pragma comment (lib, "AdvApi32.lib")#define DEFAULT_BUFLEN 512#define DEFAULT_PORT "27015"int __cdecl main(int argc, char **argv){ WSADATA wsaData; SOCKET ConnectSocket = INVALID_SOCKET; struct addrinfo *result = NULL, *ptr = NULL, hints; char *sendbuf = "this is a test"; char recvbuf[DEFAULT_BUFLEN]; int iResult; int recvbuflen = DEFAULT_BUFLEN; // 确认参数 if (argc != 2) { printf("usage: %s server-name\n", argv[0]); return 1; } // 初始化 Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; } ZeroMemory( &hints, sizeof(hints) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; //解析服务器地址和端口 iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } // 尝试一次连接直到成功 for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) { //创建套接字连接到服务器 ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); WSACleanup(); return 1; } //连接到服务器 iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; continue; } break; } freeaddrinfo(result); if (ConnectSocket == INVALID_SOCKET) { printf("Unable to connect to server!\n"); WSACleanup(); return 1; } // 发送消息 iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 ); if (iResult == SOCKET_ERROR) { printf("send failed with error: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; } printf("Bytes Sent: %ld\n", iResult); // 关闭套接字 iResult = shutdown(ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed with error: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; } // 接收消息知道对方关闭 do { iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); if ( iResult > 0 ) printf("Bytes received: %d\n", iResult); else if ( iResult == 0 ) printf("Connection closed\n"); else printf("recv failed with error: %d\n", WSAGetLastError()); } while( iResult > 0 ); // 关闭套接字,释放资源 closesocket(ConnectSocket); WSACleanup(); return 0;}
说明:
本文由giantpoplar发表于CSDN文章地址 http://blog.csdn.net/giantpoplar/article/details/47657317
转载请保留本说明
2 0
- Socket通信——Windows下,使用Winsock,C++
- SOCKET通信——winsock编程
- Socket通信——Linux下,使用C/C++
- Win32下使用Socket:WinSock
- windows下用c实现Socket通信
- windows下使用socket网络进程通信
- winsock教程- windows下的socket编程(c语言实现)
- Windows Socket 网络编程(四) —— Winsock 编程接口
- Windows进程通信——Socket通信
- windows下C调用socket实现TCP和UDP通信
- C语言实现windows和linux下socket通信
- Windows下C语言单线程socket通信
- Windows下socket网络通信
- linux-windows下socket通信
- Windows下socket通信步骤
- windows下实现socket通信
- windows平台c语言使用socket通信传送图片
- 使用C语言socket实现windows pc与ftp服务器通信---socket实现ftp客户端
- SBT
- java.lang.NoClassDefFoundError: com.umeng.analytics.mobclickagent
- Asp.net页面间传值的四种方式
- windbg解决线程死锁
- Linux下设置IP的配置命令
- Socket通信——Windows下,使用Winsock,C++
- 实例讲解js中的预编译
- tomcat如何配置到Windows服务里
- Socket通信——Java语言
- IOS开发之实现App消息推送
- Mac 实用工具
- 字节数组byte[]和整型,浮点型数据的转换——Java代码
- jsp/servlet相关技术 (二) --- jsp的原理、注释、声明、脚本等
- cocos2dx关于size的知识