459
技術社區[雲棲]
【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