1. 程式人生 > >記Windows下初次使用dev C++進行socket編程過程

記Windows下初次使用dev C++進行socket編程過程

綁定 vertica ip add 協議 spa ant dem inet_addr sans

記初次接觸socket編程,在devC++使用Winsock進行socket編程的一個過程,通過在devC++創建2個項目分別是server、client程序項目,感受通過socket使client與server的一次通訊。

1.新建項目與往常不同,不單單是需要創建一個C文件,更是要在連接庫中添加 libws2_32 技術分享圖片 技術分享圖片 技術分享圖片 技術分享圖片 在項目管理中的屬性配置連接庫,然後在項目中新建server.c 技術分享圖片 技術分享圖片面向連接的C/S程序工作流程(TCP)
  1. 使用WSAStartup()函數檢查系統協議棧安裝情況
  2. 使用socket()函數創建服務器端通信套接字
  3. 使用bind()函數將創建的套接字與服務器地址綁定
  4. 使用listen()函數使服務器套接字做好接收連接請求準備
  5. 使用accept()接收來自客戶端由connect()函數發出的連接請
  6. 根據連接請求建立連接後,使用send()函數發送數據,或者使用recv()函數接收數據
  7. 使用closesocket()函數關閉套接字(可以先用shutdown()函數先關閉讀寫通道)
  8. 最後調用WSACleanup()函數結束Winsock Sockets API
server代碼:
#pragma comment(lib,"ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>
#include 
<stdlib.h> #define DEFAULT_PORT 5050 //服務端默認端口 int main(int argc, char* argv[]) { int iPort = DEFAULT_PORT; WSADATA wsaData; SOCKET sListen,sAccept; int iLen; //客戶機地址長度 int iSend; //發送數據長度 char buf[] = "I am a server"; //要發送給客戶的信息 struct sockaddr_in ser,cli; //服務器和客戶的地址 if(WSAStartup(MAKEWORD(2
,2),&wsaData)!=0) { printf("Failed to load Winsock.\n"); //Winsock 初始化錯誤 return -1; } sListen = socket(AF_INET,SOCK_STREAM,0); //創建服務器端套接字 if(sListen == INVALID_SOCKET) { printf("socket() Failed: %d\n",WSAGetLastError()); return -1; } //以下初始化服務器端地址 ser.sin_family = AF_INET; //使用 IP 地址族 ser.sin_port = htons(iPort); //主機序端口號轉換為網絡字節序端口號 ser.sin_addr.s_addr = htonl(INADDR_ANY); //主機序 IP 地址轉換為網絡字節序主機地址 //使用系統指定的 IP 地址 INADDR_ANY if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)) == SOCKET_ERROR) //套接定與地址的綁定 { printf("bind() Failed: %d\n",WSAGetLastError()); return -1; } if(listen(sListen,5) == SOCKET_ERROR) //進入監聽狀態 { printf("lisiten() Failed: %d\n",WSAGetLastError()); return -1; } iLen = sizeof(cli); //初始化客戶端地址長度參數 while(1) //進入循環等待客戶的連接請求 { sAccept = accept(sListen,(struct sockaddr *)&cli,&iLen); if(sAccept == INVALID_SOCKET) { printf("accept() Failed: %d\n",WSAGetLastError()); return -1; } printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port)); //輸出客戶端 IP 地址和端口號 iSend = send(sAccept,buf,sizeof(buf),0); //給客戶端發送信息 if(iSend == SOCKET_ERROR) //錯誤處理 { printf("send() Failed: %d\n",WSAGetLastError()); break; } else if(iSend == 0) { break; } else { printf("send() byte: %d\n",iSend); //輸出發送成功字節數 } closesocket(sAccept); } closesocket(sListen); //關閉 socket WSACleanup(); //輸出發送成功字節數 return 0; }
2.保存最後構建並運行這個項目,編譯生成 server.exe。 server項目結構: 技術分享圖片 技術分享圖片 3.以同樣的方法新建 client 工程,編譯生成 client.exe。 面向連接的C/S程序工作流程(TCP)
  1. 使用WSAStartup()函數檢查系統協議棧安裝情況
  2. 使用socket()函數創建客戶端套接字
  3. 使用connect()函數發出也服務器建立連接的請求(調用前可以不用bind()端口號,由系統自動完成)
  4. 連接建立後使用send()函數發送數據,或使用recv()函數接收數據
  5. 使用closesocet()函數關閉套接字
  6. 最後調用WSACleanup()函數,結束Winsock Sockets API
client代碼:
#pragma comment(lib,"ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DATA_BUFFER 1024 //默認緩沖區大小
int main(int argc, char * argv[])
{
WSADATA wsaData;
SOCKET sClient;
int iPort = 5050;
int iLen; //從服務器端接收的數據長度
char buf[DATA_BUFFER]; //接收緩沖區
struct sockaddr_in ser; //服務器端地址
if(argc<2) //判斷參數輸入是否正確:client [Server IP]
{
printf("Usage: client [server IP address]\n"); //命令行提示
return -1;
}
memset(buf,0,sizeof(buf)); //初始化接收緩沖區
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("Failed to load Winsock.\n"); //Winsock 初始化錯誤
return -1;
}
ser.sin_family = AF_INET; //初始化服務器地址信息
ser.sin_port = htons(iPort); //端口轉換為網絡字節序
ser.sin_addr.s_addr = inet_addr(argv[1]); //IP 地址轉換為網絡字節序
sClient = socket(AF_INET,SOCK_STREAM,0); //創建客戶端流式套接字
if(sClient == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -1;
}
//請求與服務器端建立 TCP 連接
if(connect(sClient,(struct sockaddr *)&ser,sizeof(ser)) == INVALID_SOCKET)
{
printf("connect() Failed: %d\n",WSAGetLastError());
return -1;
}
else
{
iLen = recv(sClient,buf,sizeof(buf),0); //從服務器端接收數據
if(iLen == 0)
return -1;
else if(iLen == SOCKET_ERROR)
{
printf("recv() Failed: %d\n",WSAGetLastError());
return -1;
}
else
printf("recv() data from server: %s\n",buf); // 輸出接收數據
}
closesocket(sClient); //關閉 socket
WSACleanup();
return 0;
}
4.運行結果: 啟動 server.exe,最後啟動 client.ex 程序與服務器通信 技術分享圖片 技術分享圖片 (客戶端每次連接,會收到來自服務端的消息,服務端這邊對每次到來的訪問將打印訪問ip和端口)

記Windows下初次使用dev C++進行socket編程過程