閱讀459 返回首頁    go 技術社區[雲棲]


【C大事】第十一講:Socket網絡編程

注:上接第七講,此為視頻的第二版。

***************************

網絡編程:計算機與計算機之間的通信。


域名、ip地址 dns服務器。

手機聯係人、電話號碼

 

一個計算機可以同時運行多個網絡程序,引入了端口port
與就是一個計算機上可以並發運行多個網絡程序,而不會再互相之間產生幹擾
。網絡通訊基於“請求-響應”模型。一端發送數據,另外一端反饋數據。


c/s、b/s結構。
p2p程序:即時客戶端,優勢服務器端。

tcp傳輸控製協議、udp用戶數據報協議
打電話、發短息。


 

端口具有排他性。端口已被別的程序占用之後,就不能再使用這個端口了。例如:打開兩個qq的客戶端。所以每次連接之後,socket替客戶端動態分配了一個端口。故不需要在程序中顯示指定客戶端的端口號。


 

 

void ShowError()
{
    TCHAR* lpMsgBuf;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL,
        GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL);
    MessageBox(NULL, lpMsgBuf,"", MB_ICONERROR);
}

 

 

void SocketTest()
{
    WSADATA wsaData;
    //初始化Socket庫
    WSAStartup(MAKEWORD(2, 0), &wsaData);
    //創建一根電線
    SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    //設置電線連接服務器斷的端口
    sa.sin_port = htons(IPPORT_SMTP);//25
    // 220.181.12.14是ping smtp.163.com出來的
    sa.sin_addr.S_un.S_addr = inet_addr("220.181.12.14");
    if(connect(sock, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR){
        ShowError();
        return;
    }
//smtp服務器特點:連上之後,服務器主動向客戶端發送一條消息
    TCHAR buffer[256];
    ZeroMemory(buffer, sizeof(buffer)/sizeof(char));
    recv(sock, buffer, 256, 0);
    MessageBox(NULL, buffer, "接收的消息", MB_OK);

    TCHAR cQuit[] = "QUIT\n";
    send(sock, cQuit, lstrlen(cQuit), 0);
    ZeroMemory(buffer, sizeof(buffer)/sizeof(char));
    recv(sock, buffer, 256, 0);
    MessageBox(NULL, buffer, "發送的消息", MB_OK);

    closesocket(sock);
    WSACleanup();

}

 

 

 

 

最後更新:2017-04-03 16:49:06

  上一篇:go JavaEE中使用Filter來實現圖片的防盜鏈
  下一篇:go 【C大事】第十二講:從CFree過度到VC6