新手学习网络编程第一个例子就很麻烦,出了错误不知道如何办了。
RT.这是《Windows网络编程的代码》
服务端
- C/C++ code
// Module Name: tcpserver.cpp//// Description://// This sample illustrates how to develop a simple TCP server application// that listens for a TCP connection on port 5150 and receives data. This // sample is implemented as a console-style application and simply prints // status messages when a connection is accepted and when data is received // by the server.//// Compile://// cl -o tcpserver tcpserver.cpp ws2_32.lib//// Command Line Options://// tcpserver.exe//// NOTE: There are no command parameters. //#include <winsock2.h>#include <stdio.h>#pragma comment(lib, "ws2_32.lib")void main(void){ WSADATA wsaData; SOCKET ListeningSocket; SOCKET NewConnection; SOCKADDR_IN ServerAddr; SOCKADDR_IN ClientAddr; int ClientAddrLen; int Port = 5150; int Ret; char DataBuffer[1024]; // Initialize Winsock version 2.2 if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0) { // NOTE: Since Winsock failed to load we cannot use WSAGetLastError // to determine the error code as is normally done when a Winsock // API fails. We have to report the return status of the function. printf("WSAStartup failed with error %d\n", Ret); return; } // Create a new socket to listening for client connections. if ((ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("socket failed with error %d\n", WSAGetLastError()); WSACleanup(); return; } // Setup a SOCKADDR_IN structure that will tell bind that we // want to listen for connections on all interfaces using port // 5150. Notice how we convert the Port variable from host byte // order to network byte order. ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); // Associate the address information with the socket using bind. if (bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR) { printf("bind failed with error %d\n", WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } // Listen for client connections. We used a backlog of 5 which is // normal for many applications. if (listen(ListeningSocket, 5) == SOCKET_ERROR) { printf("listen failed with error %d\n", WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } printf("We are awaiting a connection on port %d.\n", Port); // Accept a new connection when one arrives. if ((NewConnection = accept(ListeningSocket, (SOCKADDR *) &ClientAddr, &ClientAddrLen)) == INVALID_SOCKET) { printf("accept failed with error %d\n", WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } printf("We successfully got a connection from %s:%d.\n", inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port)); // At this point you can do two things with these sockets. Await // for more connections by calling accept again on ListeningSocket // and start sending or receiving data on NewConnection. For // simplicity We will stop listening for more connections by closing // ListeningSocket. We will start sending and receiving data on // NewConnection. closesocket(ListeningSocket); // Start sending and receiving data on NewConnection. For simplicity, // we will just receive some data and report how many bytes were // received. printf("We are waiting to receive data...\n"); if ((Ret = recv(NewConnection, DataBuffer, sizeof(DataBuffer), 0)) == SOCKET_ERROR) { printf("recv failed with error %d\n", WSAGetLastError()); closesocket(NewConnection); WSACleanup(); return; } printf("We successfully received %d byte(s).\n", Ret); // For this application we do not plan to do anything else with the // connection so we will just close the connection. printf("We are now going to close the client connection.\n"); closesocket(NewConnection); // When your application is finished handling the connections // call WSACleanup. WSACleanup(); system("pause");}
客户端
- C/C++ code
// Module Name: tcpclient.cpp//// Description://// This sample illustrates how to develop a simple TCP client application// that can send a simple "hello" message to a TCP server listening on port 5150.// This sample is implemented as a console-style application and simply prints// status messages a connection is made and when data is sent to the server.//// Compile://// cl -o tcpclient tcpclient.cpp ws2_32.lib//// Command Line Options://// tcpclient.exe <server IP address> //#include <winsock2.h>#include <stdio.h>#pragma comment(lib, "ws2_32.lib")void main(int argc, char **argv){ WSADATA wsaData; SOCKET s; SOCKADDR_IN ServerAddr; int Port = 5150; int Ret; if (argc <= 1) { printf("USAGE: tcpclient <Server IP address>.\n"); return; } // Initialize Winsock version 2.2 if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0) { // NOTE: Since Winsock failed to load we cannot use WSAGetLastError // to determine the error code as is normally done when a Winsock // API fails. We have to report the return status of the function. printf("WSAStartup failed with error %d\n", Ret); return; } // Create a new socket to make a client connection. if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("socket failed with error %d\n", WSAGetLastError()); WSACleanup(); return; } // Setup a SOCKADDR_IN structure that will be used to connect // to a listening server on port 5150. For demonstration // purposes, we required the user to supply an IP address // on the command line and we filled this field in with the // data from the user. ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = inet_addr(argv[1]); // Make a connection to the server with socket s. printf("We are trying to connect to %s:%d...\n", inet_ntoa(ServerAddr.sin_addr), htons(ServerAddr.sin_port)); if (connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR) { printf("connect failed with error %d\n", WSAGetLastError()); closesocket(s); WSACleanup(); return; } printf("Our connection succeeded.\n"); // At this point you can start sending or receiving data on // the socket s. We will just send a hello message to the server. printf("We will now try to send a hello message.\n"); if ((Ret = send(s, "Hello", 5, 0)) == SOCKET_ERROR) { printf("send failed with error %d\n", WSAGetLastError()); closesocket(s); WSACleanup(); return; } printf("We successfully sent %d byte(s).\n", Ret); // When you are finished sending and receiving data on socket s, // you should close the socket. printf("We are closing the connection.\n"); closesocket(s); // When your application is finished handling the connection, call // WSACleanup. WSACleanup(); system("pause");}运行服务端总是出现10014的问题。
WSAEFAULT
The addrlen parameter is too small or addr is not a valid part of the user address space.
但是不清楚如何去改,请过来人帮助下。
[解决办法]
系统检测到在一个调用中尝试使用指针参数时的无效指针地址。
[解决办法]
单步调试哪里出的错?