一個基本的TCP/IP編程實例

//TCP1C.cpp CopyRight 小扣 XPsp3 VS2008    //  
//創建一個基本的阻塞模式TCP連接的客戶端,        //  
//與服務器建立連接後便開始發送並顯示發送量,      //  
//當收到“exit"命令時發送該命令同時程序退出。     //   

*************TCP1C.h*********************************

view plaincopy to clipboardprint?
#ifndef TCP1C_H
#define TCP1C_H

#include <iostream>
#include <WINSOCK2.H>
#pragma comment (lib,"ws2_32.lib")

#endif
#ifndef TCP1C_H
#define TCP1C_H

#include <iostream>
#include <WINSOCK2.H>
#pragma comment (lib,"ws2_32.lib")

#endif

//============================================  
#include "TCP1C.h"  

int main(){  
    WSADATA wsaData;               //用於填充套接字庫版本的有關信息  
    SOCKET ServerSocket = NULL;   //服務器套接字(用於同服務器IPv4地址綁定)  
    SOCKADDR_IN ServerSocketAddr; //服務器的IPv4地址  
    int     port = 9999;           //要連接服務器的9999端口  
    char    buf[1024];             //存儲消息用  
    int     MessageLen = 0;        //返回的消息長度  

    //加載Winsock 2.2版本  
    if(WSAStartup(MAKEWORD(2,2),&wsaData) !=0)  
    {  
        std::cout<<"WSAStartup failed"<<std::endl;  
        return 1;  
    }  

    //創建套接字  
    if((ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)  
        std::cout<<"Create ServerSocket failed with error"<<" "<<WSAGetLastError()<<std::endl;  

    //填寫服務器IPv4信息  
    ServerSocketAddr.sin_family = AF_INET;  
    ServerSocketAddr.sin_port   = htons(port);  
    ServerSocketAddr.sin_addr.s_addr   = inet_addr("127.0.0.1");  

    //連接服務器  
    if(connect(ServerSocket,(SOCKADDR*)&ServerSocketAddr,sizeof(ServerSocketAddr)) ==SOCKET_ERROR)  
        std::cout<<"Connecting failed with error"<<" "<<WSAGetLastError()<<std::endl;  
    else   
        std::cout<<"Connect successing!"<<std::endl;  

    //發送數據,直到數據內容爲"exit"則退出程序  
    while(strcmp(buf,"exit") != 0)  
    {  
        std::cout<<"Please input:"<<std::endl;  
        std::cin>>buf;  
        if((MessageLen = send(ServerSocket,buf,strlen(buf),0)) == INVALID_SOCKET)  
            std::cout<<"Send data failed with error"<<" "<<WSAGetLastError()<<std::endl;  
        else
            std::cout<<"Send"<<" "<<MessageLen<<" "<<"byte"<<"datas"<<std::endl;;  
    }  

    closesocket(ServerSocket);  
    WSACleanup();  
    return 0;  
}

 

***************TCP1S.h*******************************

view plaincopy to clipboardprint?
#ifndef BASICS_H
#define BASICS_H

#include <WINSOCK2.H>
#include <iostream>

#pragma comment (lib,"WS2_32.LIB")

#endif
*************TCP1S.cpp*******************************

view plaincopy to clipboardprint?
//TCP1S.cpp CopyRight 小扣 XPsp3 VS2008    //  
//創建一個基本的阻塞模式TCP連接的服務端,         //  
//與客戶端建立連接後便開始接收數據並顯示,        //  
//當收到“exit"消息時程序退出。                   //  
//============================================

#include "TCP1S.h"  

int main(){  

    WSADATA wsaData;               //在加載Winsock DLL版本時被用來填充該庫版本的有關信息  
    SOCKET ListeningSocket;       //用於監聽的套接字  
    SOCKET NewConnection = NULL; //accept函數反回的套接字,用於同connect方(客戶端)連繫。  
    SOCKADDR_IN ServerAddr;        //本地(服務器)IPv4地址  
    SOCKADDR_IN ClientAddr;        //connect方IPv4地址  
    int     port = 9999;           //本地打要打開的端口  
    int     ClientAddrLen = sizeof(ClientAddr); //connect方IPv4地址的長度  
    int     BufLen = 0;            //接收到的信息的長度  
    char    buf[50];               //用於存儲信息  

    /*加載2.2版本的Winsock*/
    if(WSAStartup(MAKEWORD(2,2),&wsaData))  
    {  
        std::cout<<"WSAStartup failed"<<std::endl;  
        return 1;  
    }  
    std::cout<<"WSAStartup successing!"<<std::endl;  

    /*創建套接字*/
    if((ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)    
    {  
        std::cout<<"Create ListenSocket failed with error"<<" "<<WSAGetLastError()<<std::endl;  
        return 1;  
    }  
    std::cout<<"Create ListenSocket successing!"<<std::endl;  

    /*設置服務器IPv4地址*/
    ServerAddr.sin_family = AF_INET;    
    ServerAddr.sin_port   = htons(port);  
    ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);  

    /*綁定套接字與地址信息*/
    if(bind(ListeningSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr)) == SOCKET_ERROR)   
    {  
        std::cout<<"Bind failed with error"<<" "<<WSAGetLastError()<<std::endl;  
        return 1;  
    }  
    std::cout<<"Bind successing!"<<std::endl;  

    /*開始監聽*/
    if(listen(ListeningSocket,3) == SOCKET_ERROR)  
    {  
        std::cout<<"Listen failed with error"<<" "<<WSAGetLastError()<<std::endl;  
        return 1;  
    }  
    else
    std::cout<<"Listening..."<<std::endl;  


    /*接受連接*/
    if((NewConnection = accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET)    
            std::cout<<"Accept failed with error"<<" "<<WSAGetLastError()<<std::endl;  
    else
        std::cout<<"Accept successing!"<<std::endl;  

    /*接收並顯示數據*/
    while(strcmp(buf,"exit"))    
    {  
        BufLen = recv(NewConnection,buf,sizeof(buf),0);  
        buf[BufLen] = '/0';  
        std::cout<<buf<<std::endl;  
    }  

    /*關閉套接字*/
    closesocket(ListeningSocket);  
    closesocket(NewConnection);  
    WSACleanup();  
          
    return 0;  
}

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/dclchj/archive/2009/05/25/4213318.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章