本代碼用于和第二章服務(wù)端代碼一致,監(jiān)聽12345端口,可以不斷的發(fā)送消息,直至輸入"quit"退出程序,完整參考代碼如下:
#include <winsock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") int main() { int err; char SendBuf[100]; WORD versionRequired; WSADATA wsaData; versionRequired=MAKEWORD(2,2); err=WSAStartup(versionRequired,&wsaData);//協(xié)議庫的版本信息 //通過WSACleanup的返回值來確定socket協(xié)議是否啟動(dòng) if (!err) { printf("客戶端套接字已經(jīng)打開!\n"); } else { printf("客戶端套接字打開失敗!\n"); return -1;//結(jié)束 } //注意socket這個(gè)函數(shù),他三個(gè)參數(shù)定義了socket的所處的系統(tǒng),socket的類型,以及一些其他信息 SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0); //socket編程中,它定義了一個(gè)結(jié)構(gòu)體SOCKADDR_IN來存計(jì)算機(jī)的一些信息,像socket的系統(tǒng), //端口號(hào),ip地址等信息,這里存儲(chǔ)的是服務(wù)器端的計(jì)算機(jī)的信息 SOCKADDR_IN clientsock_in; clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); clientsock_in.sin_family=AF_INET; clientsock_in.sin_port=htons(12345); //前期定義了套接字,定義了服務(wù)器端的計(jì)算機(jī)的一些信息存儲(chǔ)在clientsock_in中, //準(zhǔn)備工作完成后,然后開始將這個(gè)套接字鏈接到遠(yuǎn)程的計(jì)算機(jī) //也就是第一次握手 int r=connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//開始連接 // printf("%d\n",r); while(1) { gets(SendBuf); if(strcmp(SendBuf,"quit")==0) break; send(clientSocket,SendBuf,strlen(SendBuf)+1,0); } closesocket(clientSocket); //關(guān)閉服務(wù) WSACleanup(); return 0; }
單獨(dú)運(yùn)行客戶端,如下圖效果:
若是連同前面的服務(wù)端一起測(cè)試,先運(yùn)行服務(wù)端,再運(yùn)行客戶端,即可完成通信效果,效果圖下:
從圖中可以看到,客戶端向服務(wù)端發(fā)送三條消息,服務(wù)端都已接收,并打印長(zhǎng)度和消息信息,第四條信息退出,之后雙方退出結(jié)束程序
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程