您的位置:首页 > 理论基础 > 计算机网络

简单的 winsocket TCP通信

2016-03-05 14:53 525 查看
//服务器
#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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: