完整的win32 socket 服务器、客户端控制台收发程序。
Complete Server Code
The following is the complete source code for the TCP/IP Server
application.
Server Source Code
- #include "stdio.h"
- #include "winsock2.h"
- void main() {
- // Initialize Winsock.
- WSADATA wsaData;
- int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
- if ( iResult != NO_ERROR )
- printf("Error at WSAStartup()\n");
- // Create a socket.
- SOCKET m_socket;
- m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
- if ( m_socket == INVALID_SOCKET ) {
- printf( "Error at socket(): %ld\n", WSAGetLastError() );
- WSACleanup();
- return;
- }
- // Bind the socket.
- sockaddr_in service;
- service.sin_family = AF_INET;
- service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
- service.sin_port = htons( 27015 );
- if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
- printf( "bind() failed.\n" );
- closesocket(m_socket);
- return;
- }
-
- // Listen on the socket.
- if ( listen( m_socket, 1 ) == SOCKET_ERROR )
- printf( "Error listening on socket.\n");
- // Accept connections.
- SOCKET AcceptSocket;
- printf( "Waiting for a client to connect...\n" );
- while (1) {
- AcceptSocket = SOCKET_ERROR;
- while ( AcceptSocket == SOCKET_ERROR ) {
- AcceptSocket = accept( m_socket, NULL, NULL );
- }
- printf( "Client Connected.\n");
- m_socket = AcceptSocket;
- break;
- }
-
- // Send and receive data.
- int bytesSent;
- int bytesRecv = SOCKET_ERROR;
- char sendbuf[32] = "Server: Sending Data.";
- char recvbuf[32] = "";
-
- bytesRecv = recv( m_socket, recvbuf, 32, 0 );
- printf( "Bytes Recv: %ld\n", bytesRecv );
-
- bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
- printf( "Bytes Sent: %ld\n", bytesSent );
- return;
- }
复制代码Complete Client Code
The following is the complete source code for the TCP/IP Client Application.
Client Source Code
- #include
- #include "winsock2.h"
- void main() {
- // Initialize Winsock.
- WSADATA wsaData;
- int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
- if ( iResult != NO_ERROR )
- printf("Error at WSAStartup()\n");
- // Create a socket.
- SOCKET m_socket;
- m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
- if ( m_socket == INVALID_SOCKET ) {
- printf( "Error at socket(): %ld\n", WSAGetLastError() );
- WSACleanup();
- return;
- }
- // Connect to a server.
- sockaddr_in clientService;
- clientService.sin_family = AF_INET;
- clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
- clientService.sin_port = htons( 27015 );
- if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
- printf( "Failed to connect.\n" );
- WSACleanup();
- return;
- }
- // Send and receive data.
- int bytesSent;
- int bytesRecv = SOCKET_ERROR;
- char sendbuf[32] = "Client: Sending data.";
- char recvbuf[32] = "";
- bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
- printf( "Bytes Sent: %ld\n", bytesSent );
- while( bytesRecv == SOCKET_ERROR ) {
- bytesRecv = recv( m_socket, recvbuf, 32, 0 );
- if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
- printf( "Connection Closed.\n");
- break;
- }
- if (bytesRecv<0)
- return;
- printf( "Bytes Recv: %ld\n", bytesRecv );
- }
- return;
- }
复制代码About Servers and Clients
There are two distinct types of socket network applications: Server and Client. Servers and Clients have different behaviors; therefore, the process of creating them is different. What follows is the general model for creating a streaming TCP/IP Server and Client.
Server
- Initialize WSA.
- Create a socket.
- Bind the socket.
- Listen on the socket.
- Accept a connection.
- Send and receive data.
- Disconnect.
Client
- Initialize WSA.
- Create a socket.
- Connect to the server.
- Send and receive data.
- Disconnect.