//服务器:
#include<iostream>
#include<windows.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{
INT Ret;
WSADATA wsaData;
//首先,建立一个WSADATA结构,通常用wsaDataWSADATA wsaData;
//然后,调用WSAStartup函数,这个函数是连接应用程序与winsock.dll的第一个调用.
//其中,第一个参数是WINSOCK版本号,第二个参数是指向WSADATA的指针.该函数返回一个INT型值,通过检查这个值来确定初始化是否成功.
if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
printf("WSAStaartup() failes with error %d\n", Ret);
WSACleanup();
return -1;
}
//创建套接字,第一个参数表示IPv4,
SOCKET sockSer = socket(AF_INET, SOCK_STREAM, 0);
cout << sockSer << endl;
//定义地址结构体
SOCKADDR_IN addrSer, addrCli;
//设置地址结构体内成员,初始化
//sin_family为协议类型
addrSer.sin_family = AF_INET;
//sin_port为设置端口号,取值范围为1024~65535,1024以下为系统保留或使用
addrSer.sin_port = htons(5050);
//addrSer结构体内有sin_addr其下只有S_un.S_addr来设置链接IP,如果设置为INADDR_ANY则表示可以ping任意网址
addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//addrSer.sin_zero为了让socket_in和socket保持大小相同而留的空白字节
//绑定,将服务器信息绑定到套接字上
bind(sockSer, (sockaddr *)&addrSer, sizeof(SOCKADDR_IN));
cout << sockSer << endl;
//进行监听
listen(sockSer, 5);
cout << sockSer << endl;
//进行连接
cout << "等待客户端连接:" << endl;
SOCKET sockConn;
//SOCKADDR和SOCKADDR_IN的区别。SOCKADDR_IN用来存地址,其含有4个成员量,SOCKADDR只有两个
int len = sizeof(SOCKADDR);
sockConn = accept(sockSer,(SOCKADDR*)&addrCli,&len);
//判断是否连接成功
if (sockConn == INVALID_SOCKET)
{
cout << "connect failed!" << endl;
WSACleanup();
return 0;
}
else
{
cout << "connect success." << endl;
cout << "Client IP:>" << inet_ntoa(addrCli.sin_addr) << endl;
cout << "Client port:>" << htons(addrCli.sin_port) << endl;
}
//接收数据
char sendbuf[256];
char recvbuf[256];
while (1)
{
cout << "Ser:>";
cin >> sendbuf;
send(sockConn, sendbuf, strlen(sendbuf) + 1, 0);
recv(sockConn, recvbuf, 256, 0);
cout << "Cli:>" << recvbuf << endl;
}
closesocket(sockSer);
WSACleanup();
return 0;
}
//客户端
#include<iostream>
#include<windows.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{
INT Ret;
WSADATA wsaData;
if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
printf("WSAStaartup() failes with error %d\n", Ret);
WSACleanup();
return -1;
}
SOCKET sockCli = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSer;
addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSer.sin_port = htons(5050);
addrSer.sin_family = AF_INET;
int ret = connect(sockCli, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));
//检查是否连接上,连接上时,返回0,否则返回-1
if (ret != 0)
{
cout << "服务器连接失败." << endl;
WSACleanup();
return -1;
}
else
{
cout << "Server Accept Client Connect Success!" << endl;
cout << "Client ip:>" << inet_ntoa(addrSer.sin_addr) << endl;
cout << "Client port:>" << htons(addrSer.sin_port) << endl;
}
char sendbuf[256];
char recvbuf[256];
while (1)
{
//接收操作
recv(sockCli, recvbuf, 256, 0);
cout << "Ser:>" << recvbuf << endl;
cout << "Cli:>";
cin >> sendbuf;
send(sockCli, sendbuf, strlen(sendbuf) + 1, 0);
}
closesocket(sockCli);
WSACleanup();
return 0;
}