Socket網絡編程——C++實現


本代碼可直接使用 根據TCP/IP三次握手,實驗時可使用兩台電腦,或者打開兩個終端模擬通信。

服務器端:

#include <iostream>
#include <windows.h>

using namespace std;

#pragma comment(lib,"ws2_32.lib") //引用靜態鏈接庫



void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(2,2);   

    err =WSAStarup( wVersionRequested,&wsaData);
    if( err != 0).0
    {
        //tell the user that we could nto find a usable
        //WinSock DLL;
        return;
    }
    if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
    {
        WSACleanup();
        return;
    }
    //The WinSock DLL is acceptable,Proceed  windows下版本的協商
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SOCKET sockSer;//服務器套接字 
    sockSer = socket(AF_INET,SOCK_STREAM,0);//創建套接字,AF_INET代表IP家族,0是默認的方式創建  有連接是流式 無連接是數據包套接字

    SOCKADDR_IN addrSer,addrCli;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(5050);
    addrSer.sin_addr.S_un.S_addr = inet_addr("192.168.3.173");

    bind(sockSer,(SOCKADDR)*&addrSer,sizeof(SOCKADDR));//綁定套接字 跟服務器的相關地址信息進行綁定

    listen(sockSer,5);//監聽套接字 5是隊列大小

    SOCKET sockConn;//給出一個相應的套接字
    int len = sizeof(SOCKADDR);

    cout<<"Server Wait Client Connect......."<<endl;
    sockConn = accept(sockSer,(SOCKADDR*)&addrCli,&len);//處理新到連接 3個參數分別是服務器的套接字號;客戶端地址,相應地址層度的地址以地址形式傳遞


    if(sockConn == INVALID_SOCKET);//INVALID_SOCKET非法套接字
    {
        cout<<"Server Accept Client Connect Fail"<<endl;
        return;
    }
    else
    {
        cout<<"Server Accept Client Connect Success"<<endl;
        return;
    }

    char sendbuf[256];
    char recvbuf[256];
    while(1)
    {
        cout<<"Ser:>"
        cin>>sendbuf;//緩沖區
        if(strcmp(sendbuf,"quit")==0);//相等表示服務器請求退出
        {
            break;
        }
        send(sockConn,sendbuf,strlen(sendbuf)+1,0);//發送服務器 +1為了字符串的/0  3個參數分別是要發送的套接字,緩沖,長度

        recv(sockConn,recvbuf,256,0);//接收
        cout<<"Cli:>"<<recvbuf<<endl;
    }

    closesocket(sockSer);//
    WSACleanup();//清除版本信息

}


用戶端:

#include <iostream>
#include <windows.h>

using namespace std;

#pragma comment(lib,"ws2_32.lib")

void main()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(2,2);

    err =WSAStarup( wVersionRequested,&wsaData);
    if( err != 0)
    {
        //tell the user that we could nto find a usable
        //WinSock DLL;
        return;
    }
    if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
    {
        WSACleanup();
        return;
    }
    //The WinSock DLL is acceptable,Proceed  windows下版本的協商
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SOCKET sockSli;//服務器套接字
    sockSli = socket(AF_INET,SOCK_STREAM,0);//創建套接字  家族協議;流式套接字;默認值

    SOCKADDR_IN addrSer;//
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(5050);
    addrSer.sin_addr.S_un.S_addr = inet_addr ("127.0.0.1");

    int res = connect(sockCli,(SOCKADDR*)&addrSer,sizeof(SOCKADDR));//res為connect返回值 查閱相關函數,若為0則表示沒有錯誤
    if (res != 0)
    {
        cout<<"Client Connect Servrer Fail!"<<endl;
        return;
    }
    else
    {
        cout<<"Client Connect Servrer Success!"<<endl;
    }

    char sendbuf[256];
    char recvbuf[256];//發空間和接收空間
    while(1)
    {
        recv(sockCli,recvbuf,256,0);
        cout<<"Ser:>"<<recvbuf<<endl;

        cout<<"Cli:>";
        cin>>sendbuf;
        if(strcmp(sendbuf,"quit") == 0)//客戶端請求退出
        {
            break;
        }
        send(sockCli,sendbuf,strlen(sendbuf)+1,0);
    }
    closesocket(sockCli);
    WSACleanup();
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM