Window TCP Server

来源:互联网 发布:淘宝网六个月宝宝衣服 编辑:程序博客网 时间:2024/05/18 03:56
#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#pragma comment( lib, "ws2_32.lib" )

const static int _MAX_BUF_SIZE = 256;

using namespace std;
int _tmain( int argc , _TCHAR* argv[])
{
      // 初始化Winsock 2.2
      WSADATA wsaData ;
      if( WSAStartup ( MAKEWORD( 2, 2 ), & wsaData ) != 0 )
     {
           cout<<"WSAStartup 无法初始化 !" <<endl ;
           return -1;
     }

      // 通过WinSock 实现网络通信
      SOCKET sServer ;
     
      // 创建用于监听的Socket
      sServer = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP );
      if( INVALID_SOCKET == sServer )
     {
           cout<<"Socket Failed !" <<endl;
           WSACleanup();
           return -1;
     }

      // 设置服务器Socket 地址
      SOCKADDR_IN addrServ ;
      addrServ.sin_family = AF_INET;
      addrServ.sin_port    = htons( 9990 );   // 服务器端口号
      addrServ.sin_addr .S_un. S_addr = htonl ( INADDR_ANY );

      // 绑定
      int    retVal ;
      retVal = bind ( sServer, ( const struct sockaddr *)&addrServ , sizeof( SOCKADDR_IN ) );
      if( SOCKET_ERROR == retVal )
     {
           cout<<"bind failed !" <<endl;
           closesocket( sServer );
           WSACleanup();
           return -1;
     }

      // 监听
      retVal = listen ( sServer, 1 );
      if( SOCKET_ERROR == retVal )
     {
           cout<<"listen failed !" <<endl;
           closesocket( sServer );
           WSACleanup();
           return -1;
     }

      // 接受来自客户端的请求
      SOCKET sClient ;
      cout<<"TCP Server Start... ..." <<endl;
      sockaddr_in addrClient ;
      int addrClientlen = sizeof( addrClient );
      sClient = accept ( sServer, ( sockaddr FAR *)&addrClient , &addrClientlen );
      if( INVALID_SOCKET == sClient )
     {
           cout<<"accept failed " <<endl;
           closesocket( sServer );
           WSACleanup();
           return -1;
     }

      // 循环接受客户端数据,直到客户端发送 quit 命令
      char   buf [_MAX_BUF_SIZE];
      while( true )
     {
           ZeroMemory( buf , _MAX_BUF_SIZE );
           retVal = recv ( sClient, buf, BUFSIZ , 0 );
           if( SOCKET_ERROR == retVal )
          {
               cout<<"recv failed !" <<endl;
               closesocket( sServer );
               closesocket( sClient );
               WSACleanup();
               return -1;
          }

           // 获取系统的时间
           SYSTEMTIME st ;
           GetLocalTime(&st );
           char sDateTime [30];
           sprintf( sDateTime , "%4d-%2d-%2d %2d:%2d:%2d", st.wYear , st. wMonth, st .wDay, st.wHour , st. wMinute, st.wSecond );
           cout<<sDateTime <<"  , Recv From Client ["<< inet_ntoa(addrClient .sin_addr)<< ":"<<addrClient .sin_port<< "]: "<<buf <<endl;

           if( strcmp ( buf, "quit" ) == 0 )
          {
               retVal = send ( sClient, "quit", strlen ("quit"), 0 );
               break;
          }
           else
          {
               char msg [_MAX_BUF_SIZE];
               sprintf( msg , "Message received - %s ", buf );
               retVal = send ( sClient, msg, strlen (msg), 0 );
               if( SOCKET_ERROR == retVal )
              {
                    cout<<"send failed!" <<endl;
                    closesocket( sServer );
                    closesocket( sClient );
                    WSACleanup();
                    return -1;
              }
          }
     }

      // 最后做一些清理工作
      closesocket( sServer );
      closesocket( sClient );
      WSACleanup();
      system("pause" );
      return 0;
}
  
0 0
原创粉丝点击