//網(wǎng)絡(luò)編程客戶端//1:加載套接字庫(kù),創(chuàng)建套接字(WSAStartup() / socket());//2:向服務(wù)器發(fā)出連接請(qǐng)求(connect());//3:和服務(wù)器端進(jìn)行通信(send() / recv());//4:關(guān)閉套接字,關(guān)閉加載的套接字庫(kù)(closesocket() / WSACleanup())。#include <WinSock2.h>#include <stdio.h>#include <string.h>#include <iostream>#PRagma comment(lib,"ws2_32.lib")int main(){ WSADATA wsaData; char Buff[1024] = {}; //判斷是否可以使用window的網(wǎng)絡(luò)編程庫(kù),初始化sock資源 if (WSAStartup(MAKEWord(2,2),&wsaData) != 0) { printf("Failed to load Winsock"); return 0; } //套接字接口結(jié)構(gòu) SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(5099); //和服務(wù)器定好的端口號(hào)一樣 addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //服務(wù)器地址,這是默認(rèn)服務(wù)器在本機(jī) //inet_addr函數(shù)是舊函數(shù)庫(kù)的函數(shù),編譯時(shí)會(huì)報(bào)錯(cuò),解決辦法,打開(kāi)項(xiàng)目->屬性->配置屬性->c/c++ ->SDL檢測(cè) 將是改為否 //創(chuàng)建套接字接口 SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); if (SOCKET_ERROR == sockClient) { printf("Socket() error"); return 0; } //和服務(wù)器建立連接 //connect函數(shù) //#include <sys/socket.h> //int connect(int sockfd, const struct sockaddr* servaddr, socklen_t addrlen); // 返回:成功為0,出錯(cuò)-1 //TCP客戶用connect函數(shù)來(lái)建立一個(gè)與TCP服務(wù)器連接,sockfd是由socket函數(shù)返回的套接字描述符,第二個(gè)、第三個(gè)參數(shù)分別是指向一個(gè)套接字地址結(jié)構(gòu)的指針和該結(jié)構(gòu)的大小, //套接字結(jié)構(gòu)必須含有服務(wù)器的ip地址和端口號(hào)。注意:如果connect失敗后,就必須close當(dāng)前的套接字描述符并重新調(diào)用socket。 //客戶端在調(diào)用connect前不必非得調(diào)用bind函數(shù)(比如UDP客戶端編程中一般就不用調(diào)用bind),內(nèi)核會(huì)確定源IP地址,并選擇一個(gè)臨時(shí)端口作為源端口。 //如果是TCP套接字,調(diào)用connect函數(shù)將激發(fā)TCP的三次握手過(guò)程,而且僅在連接建立成功或出錯(cuò)時(shí)才返回。注意:connect是在接收到服務(wù)端響應(yīng)的SYN + ACK時(shí)的返回的, //也就是三次握手的第二次動(dòng)作之后。 //UDP是可以調(diào)用connect函數(shù)的,但是UDP的connect函數(shù)和TCP的connect函數(shù)調(diào)用確是大相徑庭的,這里沒(méi)有三次握手過(guò)程。 //內(nèi)核只是檢查是否存在立即可知的錯(cuò)誤(比如目的地址不可達(dá)),記錄對(duì)端的IP和端口號(hào),然后立即返回調(diào)用進(jìn)程。 //使用了connect的UDP編程就可不必使用sendto函數(shù)了,直接使用write / read即可。 if (connect(sockClient,(struct sockaddr*)&addrSrv,sizeof(addrSrv)) == INVALID_SOCKET) { printf("Connect() error"); return 0; } else { //接收數(shù)據(jù) recv(sockClient, Buff, sizeof(Buff), 0); printf("%s/n", Buff); } //發(fā)送數(shù)據(jù) char buff[] = "This is Client Message"; send(sockClient, buff, sizeof(buff), 0); closesocket(sockClient); WSACleanup(); system("pause"); return 0;}
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注