TCP/IP是一套支持网络通信的协议系统(亦称TCP/IP协簇)其传输过程和格式的实际行为由厂商的TCP/IP软件(微软的winsocket)实现。
一、首先明白以下几点:
1、网络:计算机或类似计算机设备之间通信的常用传输介质的集合(通常传输介质为金属导线、甚至没有线路)。
2、网络协议:帮助定义复杂数据传输过程的通用规则。
3、TCP/IP标准:定义TCP/IP网络通信规则。
4、TCP/IP实现:是一个软件组,计算机通过它参与到TCP/IP网络中。
5、TCP/IP核心:逻辑编址(唯一MAC地址);路由选择(路由器、交换机);名称解析(DNS);错误控制和流量控制;应用支持。
6、TCP/IP基本联网系统:
7、TCP是面向连接的协议,提供复杂的流程控制和错误控制,确保发送数据的质量,更可靠,但是速度慢。
8、UDP是无连接协议,不可靠,但速度相对较快,多用于DNS。
二、TCP/IP应用流程
这里主要讲TCP连接,既然是面向连接协议,自然有服务端和客户端之别。
1、初始化网络:WSASTartup()
2、创建套接字:socket()
3、绑定端口:bind()
4、服务端监听:listen()
5、服务端等待连接:accept()
6、客户端请求连接:connect()
6、发送数据:send()
7、接收数据:recv()
8、关闭连接(删除套接字):closesocket()
9、清扫网络:WSAClean()
注意事项:*以上函数调用需要加入ws2_32.lib(ms)或者libws2_32(MingW)
*除了前面有客户端和服务端字样的其余皆可用于客户端和服务端程序
以下是C++服务端函数代码,只需要在主函数调用即可
#include <iostream>
#include <winsock2.h>
SOCKET connection;
SOCKET socketserver;
char buf[]="this is TCPServer!";
static
void server()
{
WSADATA wsaData;
//调用网络函数之前都需要调用此函数
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("failed to load winsock");
return;
}
//creat socket
socketserver=socket(AF_INET,SOCK_STREAM,0);
//绑定端口
SOCKADDR_IN addrserver;
addrserver.sin_family=AF_INET;
addrserver.sin_port=htons(10012);
addrserver.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
int re=bind(socketserver, (LPSOCKADDR)&addrserver, sizeof(SOCKADDR_IN));
if(re==SOCKET_ERROR)
{
printf("faild bind:%d\n",WSAGetLastError());
return;
}
//监听
if(listen(socketserver,10)==SOCKET_ERROR)
{
printf("listen failed:%d\n",WSAGetLastError());
return;
}
printf("listening......\n");
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
//等待连接
connection=accept(socketserver,(SOCKADDR*)&addrClient,&len);
if(connection==SOCKET_ERROR)
{
printf("Accept failed:%d",WSAGetLastError());
break;
}
printf("Accept client IP:[%s]\n",inet_ntoa(addrClient.sin_addr));
//发送数据
int iSend=send(connection,buf,sizeof(buf),0);
if(iSend==SOCKET_ERROR)
{
printf("send failed!");
}
//接收数据
char recvBuf[100];
memset(recvBuf,0,sizeof(recvBuf));
recv(connection,recvBuf,sizeof(recvBuf),0);
printf("%s\n",recvBuf);
}
closesocket(socketserver);
WSACleanup();
system("pause");
}
下面是客户端代码:
#include <iostream>
#include <WinSock2.h>
using namespace std;
int main(int argc, char *argv[])
{
static char addr[]="0.0.0.0";
cout<< "please enter the IP you want to Link:\n";
cin>>addr;
const char *host=addr;
char senddata[]="this is the fisrt message!";
while(1)
{
cout << "TCPtest client:" << endl;
//加载套接字
WSADATA wsaData;
char buf[1024];
memset(buf,0,sizeof(buf));
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("failed to load Winsock!");
break;
}
//创建套接字
SOCKADDR_IN addrserv;
addrserv.sin_family=AF_INET;
addrserv.sin_port=htons(10012);
addrserv.sin_addr.S_un.S_addr=inet_addr(host);
SOCKET socketClient=socket(AF_INET,SOCK_STREAM,0);
if(socketClient==SOCKET_ERROR)
{
printf("socket() error%d",WSAGetLastError());
break;
}
//请求链接
if(connect(socketClient,(struct sockaddr*)&addrserv,sizeof(addrserv))==INVALID_SOCKET)
{
printf("connetion failed!");
break;
}
else
{
//接收数据
recv(socketClient,buf,sizeof(buf),0);
printf("%s\n",buf);
//发送数据
const char *sendbuff=senddata;
send(socketClient,sendbuff,sizeof(senddata),0);
cout<< "enter something you want send(q to quit!):\n";
cin>>senddata;
closesocket(socketClient);
WSACleanup();
}
}
return 0;
}
首先运行服务端,再运行客户端,结果如下: