簡單的 winsocket TCP通信

//服務器
#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章