windows网络编程-socket
server部分
1,Initialize Winsock. 2,Create a socket. 3,Bind the socket. 4,Listen on the socket for a client. 5,Accept a connection from a client. 6,Receive and send data. 7,Disconnect.
#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <iphlpapi.h> #include <stdio.h> #pragma comment(lib, "Ws2_32.lib") int main() { //Initializing Winsock WSADATA wsaData; int iResult; iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } //Creating a Socket for the Server struct addrinfo* result = NULL, * ptr = NULL, hints; 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, "20000", &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; } SOCKET listenSocket = INVALID_SOCKET; listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (listenSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; } //Binding a 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); //Listening on a Socket iResult = listen(listenSocket, SOMAXCONN); if (iResult == SOCKET_ERROR) { printf("Listen failed with error: %ld\n", WSAGetLastError()); closesocket(listenSocket); WSACleanup(); return 1; } //Accepting a Connection SOCKET clientSocket = INVALID_SOCKET; clientSocket = accept(listenSocket, NULL, NULL); if (clientSocket == INVALID_SOCKET) { printf("accept failed: %d\n", WSAGetLastError()); closesocket(listenSocket); WSACleanup(); return 1; } //Receiving and Sending Data on the Server #define DEFAULT_BUFLEN 512 char recvbuf[DEFAULT_BUFLEN]; int iSendResult; int recvbuflen = DEFAULT_BUFLEN; // 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: %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: %d\n", WSAGetLastError()); closesocket(clientSocket); WSACleanup(); return 1; } } while (iResult > 0); //Disconnecting the Server // shutdown the send half of the connection since no more data will be sent iResult = shutdown(clientSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed: %d\n", WSAGetLastError()); closesocket(clientSocket); WSACleanup(); return 1; } return 0; }
client部分
1,Initialize Winsock. 2,Create a socket. 3,Connect to the server. 4,Send and receive data. 5,Disconnect.