C++網絡編程(socket)TCP

1.C++網絡編程要用到ws2_32.lib這個動態鏈接庫,所以在程序運行前要添加動態鏈接庫。在VS中添加動態連接庫,右鍵項目解決方案,屬性,連接器,輸入,附加項,然後在開頭位置輸入ws2_32.lib;即可。

2.C++網絡編程,頭文件要包含sockwin2.h

3.C++網絡編程,可以使用面向連接的TCP協議,也可以使用面向無連接的UDP協議

首先是使用TCP協議的示例

(1)服務器端程序

#include<WinSock2.h>
#include<stdio.h>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//實現服務器端程序,接收客戶端的請求並做出響應//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{                        
  return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 )
{
    WSACleanup( );
    return;
}
//以上部分用WSAStatrUp打開socket動態鏈接庫,可以查看MSDN中關於WSAStatrUp的解釋
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創建SOCKET
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);//設置服務器的端口號
bind(sockSrv,(sockaddr*)&addrSrv,sizeof(SOCKADDR));//將套接字與端口號進行綁定
listen(sockSrv,5);//監聽來自客戶端的請求
SOCKADDR_IN addrClient;//此地址用於保存客戶端的地址信息
    int len=sizeof(SOCKADDR);
    while(1)
    {
        SOCKET socketConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//與客戶端建立連接
        char sendBuf[100];
        sprintf(sendBuf,"Welcome %s to my world",inet_ntoa(addrClient.sin_addr));
        send(socketConn,sendBuf,strlen(sendBuf)+1,0);//像客戶端發送歡迎信心
        char recvBuf[100];
        recv(socketConn,recvBuf,100,0);//接收客戶端的信息
        printf("%s\n",recvBuf);  
  closesocket(socketConn);//關閉套接字
    }
}

(2)客戶端程序

#include<WinSock2.h>
#include<stdio.h>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//客戶端程序,向服務器端發送請求//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
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庫
    SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(6000);//設置要請求的服務器的地址及端口號
connect(socketClient,(sockaddr*)&addrSrv,sizeof(SOCKADDR));//建立連接請求
    char recvBuf[100];
    recv(socketClient,recvBuf,100,0);//接收服務器的信息
    printf("%s\n",recvBuf);
    send(socketClient,"this is zhangsan",strlen("this is zhangsan")+1,0);//像服務器發送信息
    closesocket(socketClient);//關閉套接字
    WSACleanup();//關閉WSA
}

基於TCP的面向連接的協議是可靠的協議,與UDP相比有可靠的特點,但是消耗更多的網絡資源

基於UDP的面向無連接的協議將在下一篇文章中講述

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