//InitSock.h
#pragma once
#include <WinSock2.h>
#pragma comment(lib,"WS2_32")
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();
}
};
//TCPServer.cpp
#include "InitSock.h"
#include <stdio.h>
CInitSock initSock; //初始化Winsock庫
int main()
{
//建立套接字
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");
return 0;
}
//進入監聽模式
if (::listen(sListen,2) == SOCKET_ERROR)
{
printf("Failed listen()\n");
return 0;
}
//循環接受客戶的連接配接請求
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
printf("Length of sockaddr_in is: %d",nAddrLen);
SOCKET sClient;
char szText[] = "TCP Server Demo!\r\n";
while(TRUE)
{
sClient = ::accept(sListen,(SOCKADDR *)&remoteAddr,&nAddrLen);
if (sClient == INVALID_SOCKET)
{
printf("Failed accapt()");
continue;
}
printf("接受到一個連接配接:%s\r\n",inet_ntoa(remoteAddr.sin_addr));
//向用戶端發送資料
::send(sClient,szText,strlen(szText),0);
}
//關閉用戶端的連接配接
::closesocket(sListen);
return 0;
}
//TCPClient
#include <stdio.h>
#include "InitSock.h"
CInitSock initSock;
int main()
{
//建立套接字
SOCKET s = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
printf("Failed socket()\n");
return 0;
}
//在這裡可以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");
return 0;
}
//接收資料
char buff[256];
int nRev = ::recv(s,buff,256,0);
if (nRev>0)
{
buff[nRev] = '\0';
printf("接受到資料:%s",buff);
}
//向服務端發送資料
char szText[] = "TCP client demo \r\n";
::send(s,szText,strlen(szText),0);
//關閉套接字
::closesocket(s);
return 0;
}