基于TCP/IP協議的C++網絡編程(API函數版)
源代碼:http://download.csdn.net/detail/nuptboyzhb/4169959
基于TCP/IP協議的網絡編程
定義變量——獲得WINSOCK版本——加載WINSOCK庫——初始化——創建套接字 ——設置套接字選項——關閉套接字——卸載WINSOCK庫——釋放所有資源
整個程序架構分為兩大部分,服務器端客戶端。
服務器SOCKET程序流程:
socket()→bind()→listen→accept()→recv()/send()→closesocket()
客戶端:
socket→bind()→connect()→send()/recv()→closesocket()
編程舉例:
約定發送消息的格式為如下結構體:
typedef struct
{
int ID;
char data[255];
}TcpMessage;
應用程序的頭文件如下:
#include <winsock2.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
端口號為:4500
服務器端:
1、 初始化:
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0)
return 0;
2、 創建套接字:
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
3、 使套接字和本地地址綁定
// 在sockaddr_in結構中裝入地址信息
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4500); // htons函數將主機的無符號短整形數轉換成網絡
//字節順序
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf(" bind error \n");
closesocket(sListen);
return 0;
}
4、監聽端口
if(listen(sListen, 5) == SOCKET_ERROR)
{
printf("listen error\n");
closesocket(sListen);
return 0;
}
5、等待接受連接,(如無連接,一直等待)
SOCKET sClient;//用于保存accept返回的套接字
sClient = accept(sListen,0,0);//accept函數調用失敗則繼續等待連接。
if(sClient == INVALID_SOCKET)
{
printf("accept() error");
}
6、用第5步中accept函數返回的套接字進行收發通信
6.1、接收:(如果沒有接到,會等待!)
TcpMessagerevData;//定義接收消息的結構體變量
int ret=recv(sClient,(char *)&revData,sizeof(revData),0);
if(ret>0)//說明,收到字節
{
switch (revData.ID)//對不同的ID,可以有不同的反應
{
case 1:
……..
case 2:
……..
}
}
6.2、發送:
TcpMessage sendData;
memset((char*)&sendData,0,sizeof(sendData));//初始化為0
sendData.ID=1;//為ID成員變量賦值
strcpy(sendData.data,"\r\n..要發送的字符信息 ");
if(send(sClient,(char*)&sendData,sizeof(sendData),0)==SOCKET_ERROR)
{
char error[10];
int errorcode=WSAGetLastError();
itoa(errorcode,error,10);
MessageBox(NULL,error,"發送失敗,錯誤碼為:",MB_OK);
printf("send error!");
}
7、關閉
closesocket(sClient);//由accept生成的套接字
closesocket(sListen);//服務端套接字
WSACleanup();
客戶端
1、 初始化
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0)
return 0;
2、 創建套接字
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
3、 使套接字和本地地址綁定
// 在sockaddr_in結構中裝入服務器端地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(4500);// htons函數將主機的無符號短整形數轉換成網絡
//字節順序,4500端口為要連接服務器端的端口
servAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");//服務器端ip
4、 連接服務器
if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
//注意,要先把服務器打開,否則連接失敗
5、 收發通信
用send和recv函數,這一點和服務器端一樣
6、 關閉
closesocket(sClient);//客戶端只有一個連接套接字
WSACleanup();
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成