//服務器
#include<iostream>
#include<WinSock2.h> // socket 所需要的頭文件
#pragma comment(lib,"WS2_32.lib")// link socket 庫
#define PORT 9999
#define BUFLEN 1024
using namespace std;
int main()
{
WSADATA wsaData;
// 1 啓動並初始化winsock(WSAStarup)
if (WSAStartup(MAKEWORD(2, 2), &wsaData))//成功返回0
{
return FALSE;
}
//2 創建套接字(socket)
SOCKET sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
{
WSACleanup();
return FALSE;
}
//3 準備通信地址
SOCKADDR_IN addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(PORT);
addrServer.sin_addr.s_addr = INADDR_ANY;//任意可用地址
//4 綁定地址與socket(bind)
if (SOCKET_ERROR==bind(sServer, (const sockaddr*)&addrServer, sizeof(SOCKADDR_IN)))
{
closesocket(sServer);
WSACleanup();
return FALSE;
}
//5 監聽 (listen)
if (SOCKET_ERROR == listen(sServer, SOMAXCONN))
{
closesocket(sServer);
WSACleanup();
}
// 6 等待客戶端連接(accpet)
sockaddr_in addrClient;
int addrClientLen = sizeof(addrClient);
cout << "服務器啓動成功,等待客戶端連接中。。。。" << endl;
SOCKET sClient = accept(sServer, (sockaddr *)&addrClient, &addrClientLen);
if (INVALID_SOCKET == sClient)
{
cout << WSAGetLastError() << endl;
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return FALSE;
}
//7 接收數據(recv)
char recvBuf[BUFLEN];
ZeroMemory(recvBuf, sizeof(recvBuf));
if (SOCKET_ERROR == recv(sClient, recvBuf, sizeof(recvBuf), 0))
{
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return FALSE;
}
cout << "客戶端(" << inet_ntoa(addrClient.sin_addr) << ":" << addrClient.sin_port << "):" << recvBuf << endl;
//8 發送數據
char sendBuf[BUFLEN] = "你好客戶端!";
if (SOCKET_ERROR==send(sClient, sendBuf, sizeof(sendBuf), 0))
{
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return FALSE;
}
system("pause");
system("pause");
return TRUE;
}
/*
注:1:MAKEWORD把參數組成一個WORD(雙字節)類型數據並返回這個WORD類型數值,高位代表(修訂本)號,低位字節指定主版本號(其代表)
2:socket(AF_INET,//The Internet Protocol version 4 (IPv4) address family
SOCK_STREAM,//, two-way,This socket type uses the Transmission Control Protocol (TCP) for the Internet address family (AF_INET or AF_INET6).
IPPROTO_TCP//The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_STREAM.
)
*/
//客戶端
#include<iostream>
#include<WinSock2.h>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
#define BUFLEN 1024
#define PORT 9999
void getIP(char*szHostaddress);
int main()
{
WSADATA wsaData;
// 1 啓動並初始化winsock(WSAStarup)
if (WSAStartup(MAKEWORD(2, 2), &wsaData))//成功返回0
{
return FALSE;
}
//2 創建套接字(socket)
SOCKET sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sHost)
{
closesocket(sHost);
WSACleanup();
return FALSE;
}
//3 準備通信地址
char szHostaddress[200];
getIP(szHostaddress);
SOCKADDR_IN addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(PORT);
addrServer.sin_addr.s_addr = inet_addr(szHostaddress);
//4 連接服務器(connect)
if (SOCKET_ERROR == connect(sHost, (const sockaddr*)&addrServer, sizeof(addrServer)))
{
closesocket(sHost);
WSACleanup();
return FALSE;
}
//5 發送數據 (send)
char sendBuf[BUFLEN] = "你好服務器!";
if (SOCKET_ERROR == send(sHost, sendBuf, sizeof(sendBuf), 0))
{
closesocket(sHost);
WSACleanup();
return FALSE;
}
cout << "客戶端發送消息成功!" << endl;
//7 接收數據(recv)
char recvBuf[BUFLEN];
ZeroMemory(recvBuf, sizeof(recvBuf));
if (SOCKET_ERROR == recv(sHost, recvBuf, sizeof(recvBuf), 0))
{
closesocket(sHost);
WSACleanup();
return FALSE;
}
cout << "服務器發來的消息:" <<recvBuf<< endl;
system("pause");
}
void getIP(char*szHostaddress){
char szHostname[100];
if (gethostname(szHostname, sizeof(szHostname)) != SOCKET_ERROR)//先得到主機名
{
HOSTENT *pHostEnt = gethostbyname(szHostname);//通過名字拿到地址
if (pHostEnt != NULL)
{
sprintf(szHostaddress, "%d.%d.%d.%d",
(pHostEnt->h_addr_list[0][0] & 0x00ff),
(pHostEnt->h_addr_list[0][1] & 0x00ff),
(pHostEnt->h_addr_list[0][2] & 0x00ff),
(pHostEnt->h_addr_list[0][3] & 0x00ff));
}
}
else
return;
}