孙鑫 VC++深入详解第14课——TCP通信/UDP通信(转)

原文转自 http://blog.csdn.net/supersonico/article/details/18900319

一.用VC++来编写TCP 服务器/客户端的简单程序。

注意事项:

1.要加载ws2_32.lib链接库。

项目->属性->弹出属性页->连接器->输入->附加依赖项

2.要使用#include <WinSock2.h>头文件。

 

实现步骤:

1.服务器端:

①加载套接字库 (可以直接从MSDN上复制  WSAStartup)

②创建socket

③绑定socket(bind)

④将socket设置成监听状态(listen)

⑤等待客户端的访问(accept)

⑥接收客户端信息(recv)

⑦往客户端发送信息(send)

⑧关闭套接字(closesocket)

⑨清除套接字库(WSACleanup)

#include <iostream>
#include <WinSock2.h>
#include <stdlib.h>
using namespace std;

void main()
{
    //加载套接字  
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(1, 1);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        return;
    }
    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
    {
        WSACleanup();
        return;
    }

    //创建用于监听的套接字
    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(5656);

    //绑定套接字
    bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
    //将套接字设置为监听模式
    listen(sockSrv, 5);

    SOCKADDR_IN addrClient;
    int len = sizeof(SOCKADDR);

    while (1)
    {
        //等待客户的请求到来
        SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
        char sendBuf[100];
        sprintf_s(sendBuf, 100, "Welcome %s", inet_ntoa(addrClient.sin_addr));

        //发送数据  
        send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);
        char recvBuf[100];
        //接受数据
        recv(sockConn, recvBuf, 100, 0);
        //打印接受的数据
        printf("%s
", recvBuf);
        //关闭套接字
        closesocket(sockConn);
    }
}

2.客户端:

①加载套接字库

②向服务器发送请求 connect

③接受服务器的信息 recv

④向服务器发送信息 send

⑤关闭套接字 closesocket

⑥清除套接字库 WSACleanup

#include <iostream>  
#include <WinSock2.h>  
#include <stdlib.h>  
using namespace std;

void main()
{
    //加载套接字  
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(1, 1);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        return;
    }
    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
    {
        WSACleanup();
        return;
    }

    //创建套接字  
    SOCKET socketClient = socket(AF_INET, SOCK_STREAM, 0);
    //向服务器发送请求  
    SOCKADDR_IN sockAddrClient;
    sockAddrClient.sin_addr.S_un.S_addr = inet_addr("120.77.57.44");
    sockAddrClient.sin_family = AF_INET;
    sockAddrClient.sin_port = htons(5656);

    if (SOCKET_ERROR == connect(socketClient, (SOCKADDR*)&sockAddrClient, sizeof(SOCKADDR)))
    {
        closesocket(socketClient);
        WSACleanup();
        return;
    }
    //接受信息  
    char recvBuf[100];
    recv(socketClient, recvBuf, 100, 0);
    printf("%s
", recvBuf);
    //发送数据  
    send(socketClient, "This is lisi", strlen("This is lisi") + 1, 0);
    //关闭套接字  
    closesocket(socketClient);
    WSACleanup();
    cin.get();
    cin.get();
}

 

二.用VC++来编写UDP 服务器/客户端的简单程序。

1.服务器端:

①加载套接字库(WSAstartup)

②创建socket

③绑定socket(bind)

④接受从客户端发来的信息(recvfrom)

⑤关闭套接字(closesocket)

⑥清空套接字库(WSAClearup)

#include <iostream>  
#include <stdlib.h>  
#include <WinSock2.h>  
  
using namespace std;  
  
void main()  
{  
    //加载套接字  
    WORD wVersionRequested;  
    WSADATA wsaData;  
    int err;  
  
    wVersionRequested = MAKEWORD(1,1);  
  
    err = WSAStartup(wVersionRequested,&wsaData);  
    if (err != 0)  
    {  
        return ;  
    }  
    if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)  
    {  
        WSACleanup();  
        return ;  
    }  
  
    //创建套接字  
    SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);  
  
    SOCKADDR_IN sockAddrSrv;  
    sockAddrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
    sockAddrSrv.sin_family = AF_INET;  
    sockAddrSrv.sin_port = htons(6000);  
    //绑定套接字  
    bind(sockSrv,(SOCKADDR*)&sockAddrSrv,sizeof(SOCKADDR));  
  
    SOCKADDR_IN sockAddrClient;  
    int len = sizeof(SOCKADDR);  
    char recvBuf[100];  
    //接受客户端信息  
    recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&sockAddrClient,&len);  
    printf("%s
",recvBuf);  
  
    //关闭套接字  
    closesocket(sockSrv);  
    //清除套接字库  
    WSACleanup();  
    cin.get();  
    cin.get();  
}  

 

2.客户端:

①加载套接字库 (WSAstartup)

②创建socket

③发送数据(sendto)

④关闭套接字(closesocket)

⑤清空套接字库(WSAClearup)

#include <iostream>  
#include <stdlib.h>  
#include <WinSock2.h>  
  
using namespace std;  
  
void main()  
{  
    //加载套接字  
    WORD wVersionRequested;  
    WSADATA wsaData;  
    int err;  
  
    wVersionRequested = MAKEWORD(1,1);  
  
    err = WSAStartup(wVersionRequested,&wsaData);  
    if (err != 0)  
    {  
        return ;  
    }  
    if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)  
    {  
        WSACleanup();  
        return ;  
    }  
    //创建套接字  
    SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);  
      
    SOCKADDR_IN sockAddrSrv;  
    sockAddrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");  
    sockAddrSrv.sin_family = AF_INET;  
    sockAddrSrv.sin_port = htons(6000);  
  
    //char sendBuf[100];  
    sendto(sockClient,"Hello",strlen("Hello")+1,0,(SOCKADDR*)&sockAddrSrv,sizeof(SOCKADDR));  
    closesocket(sockClient);  
    WSACleanup();  
    cin.get();  
    cin.get();  
}

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/happykoukou/p/7988115.html