#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "WS2_32") // 連結到WS2_32.lib
class CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
// 初始化WS2_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if(::WSAStartup(sockVersion, &wsaData) != 0)
exit(0);
}
~CInitSock()
::WSACleanup();
};
CInitSock initSock; // 初始化Winsock庫
int main1();
int main2();
void main()
printf("Please select a item:/n");
printf("s:Server/n");
printf("c:Client/n");
char a;
while(1){
scanf("%c",&a);
if(a=='s'){main1();break;}
else if(a=='c'){main2();break;}
else continue;
///伺服器端綁定監聽時,每接收一個新連結時,都會接收用戶端來的資料;向用戶端發送資料
///用戶端連接配接上伺服器後,就向伺服器端發送資料;接收一次從伺服器發來的資料
//Server
int main1()
// 建立套節字
SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
printf("Failed socket() /n");
return 0;
// 填充sockaddr_in結構
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
// 綁定這個套節字到一個本地位址
if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
printf("Failed bind() /n");
// 進入監聽模式
if(::listen(sListen, 2) == SOCKET_ERROR)
printf("Failed listen() /n");
// 循環接受客戶的連接配接請求
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
SOCKET sClient;
while(TRUE)
// 接受一個新連接配接
sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
if(sClient == INVALID_SOCKET)
printf("Failed accept()");
continue;
printf(" 接受到一個連接配接:%s /r/n", inet_ntoa(remoteAddr.sin_addr));
// 接收用戶端來的資料
char buff[256];
int nRecv = ::recv(sClient, buff, 256, 0);
if(nRecv > 0)
buff[nRecv] = '/0';
printf(" 接收到資料:%s", buff);
//發送資料
char szText[] = "data from TCP Server to TCP Client success! /r/n";
// 向用戶端端發送資料
::send(sClient, szText, strlen(szText), 0);
// 關閉同用戶端的連接配接
::closesocket(sClient);
// 關閉監聽套節字
::closesocket(sListen);
//Client
int main2()
SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET)
printf(" Failed socket() /n");
// 也可以在這裡調用bind函數綁定一個本地位址
// 否則系統将會自動安排
// 填寫遠端位址資訊
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(4567);
// 注意,這裡要填寫伺服器程式(TCPServer程式)所在機器的IP位址
// 如果你的計算機沒有聯網,直接使用127.0.0.1即可
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
printf(" Failed connect() /n");
char szText[] = "data from TCP Client to TCP Server success! /r/n";
// 向伺服器端發送資料
::send(s, szText, strlen(szText), 0);
// 接收伺服器來的資料
int nRecv = ::recv(s, buff, 256, 0);
// 關閉套節字
::closesocket(s);