Winsock使用之客户端和服务器完整代码
来源:互联网 发布:京劳务公司 优化外包 编辑:程序博客网 时间:2024/05/17 03:58
本节包含 TCP/IP 客户端和服务器应用程序的完整源代码︰
完整客户端源码
#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <winsock2.h>#include <ws2tcpip.h>#include <stdlib.h>#include <stdio.h>// Need to link with 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; // Validate the parameters /*if (argc != 2) { printf("usage: %s server-name\n", argv[0]); return 1; }*/ // Initialize 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; // Resolve the server address and port iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } // Attempt to connect to an address until one succeeds for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) { // Create a SOCKET for connecting to server 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; } // Connect to server. 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; } // Send an initial buffer 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); // shutdown the connection since no more data will be sent iResult = shutdown(ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed with error: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; } // Receive until the peer closes the connection 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 ); // cleanup closesocket(ConnectSocket); WSACleanup(); system("pause"); return 0;}
完整服务器代码
#undef UNICODE#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <winsock2.h>#include <ws2tcpip.h>#include <stdlib.h>#include <stdio.h>// Need to link with 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; // Initialize 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; // Resolve the server address and port iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } // Create a SOCKET for connecting to server 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; } // Setup the TCP listening socket 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; } // Accept a client socket ClientSocket = accept(ListenSocket, NULL, NULL); if (ClientSocket == INVALID_SOCKET) { printf("accept failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; } // No longer need server socket closesocket(ListenSocket); // Receive until the peer shuts down the connection do { iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); if (iResult > 0) { printf("Bytes received: %d\n", iResult); // Echo the buffer back to the sender 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); // shutdown the connection since we're done iResult = shutdown(ClientSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } // cleanup closesocket(ClientSocket); WSACleanup(); system("pause"); return 0;}
1.客户端应用程序启动之前就应该开始服务器应用程序。
2.若要执行服务器,将完整的服务器源代码编译和运行的可执行文件。服务器应用程序侦听 TCP 端口 27015 为客户端连接。一旦一个客户端连接,服务器从客户端和回声(发送) 收到回客户端的数据接收数据。当客户端关闭了连接时,服务器客户端套接字关闭,关闭的套接字,并退出。
3.执行客户端,完整的客户端源代码编译和运行的可执行文件。客户端应用程序需要该名称的计算机或 IP 地址的计算机在运行服务器应用程序作为命令行参数执行时传递客户端。如果客户端和服务器在样本计算机上执行的可以如下启动客户端︰
client localhost
4.客户端试图连接到服务器上的 TCP 端口 27015。一旦客户端连接,客户端向服务器发送数据和接收从服务器返回的任何数据发送。客户端关闭套接字,然后退出。
0 0
- Winsock使用之客户端和服务器完整代码
- Winsock使用之Winsock服务器程序
- C#完整聊天室服务器和客户端代码实例
- winsock编程之基础篇代码---服务器
- Winsock使用之创建客户端Socket
- 使用TDI与WinSock进行客户端服务器编程
- Winsock程序设计入门(3)修订版-多线程TCP服务器和客户端
- 基于Winsock控件制作的一个“服务器,N客户端”通讯程序(完整原程序)
- 基于Winsock控件制作的一个“服务器,N客户端”通讯程序(完整原程序)
- winsock实现客户端 服务器通信
- 使用log4cplus实现的分目录存放日志服务器完整工程+关键客户端代码
- 使用epoll和多线程实现服务器和客户端的代码
- 使用Winsock的客户端程序
- Winsock使用之开始使用Winsock
- VB6 通过winsock控件数组实现客户端和服务器多对一通信
- 求vc高手们帮忙,用vc++6.0实现winsock的服务器和客户端通信
- VB6 通过winsock控件数组实现客户端和服务器多对一通信
- IOCP--Windows服务器编程之客户端代码
- HDU - 3466 Proud Merchants骄傲的商人(01背包变形)
- poj3461 Oulipo(KMP)
- 哪些年,一起追过的算法
- unity最佳实践的50技巧
- JDK安装原理
- Winsock使用之客户端和服务器完整代码
- POJ 3233 Matrix Power Series
- 关于python分号报invalidsyntax错误的问题
- php缓存技术之静态缓存
- <hdoj4607>Park Visit
- 安卓,android,高仿真哔哩哔哩动画app客户端,毕业论文+服务器端
- POJ 3974 Palindrome
- Java中的File文件类详解
- c++ primer读书笔记6.1~6.2