天天看點

TCP Server《——》TCP Client

#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);