服务器端程序:
1、加载套接字库
2、创建套接字(socket)。
3、将套接字绑定到一个本地地址和端口上(bind)。
4、将套接字设为监听模式,准备接收客户请求(listen)。
5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
6、用返回的套接字和客户端进行通信(send/recv)。
7、返回,等待另一客户请求。
8、关闭套接字。
客户端程序:
1、加载套接字库
2、创建套接字(socket)。
3、向服务器发出连接请求(connect)。
4、和服务器端进行通信(send/recv)。
5、关闭套接字。
TCP服务器端代码如下:
//TCP服务器端代码如下
#include<Winsock2.h>
#include<stdio.h>
void main()
{
/*--------1、加载套接字库 -------*/
WORD wVersionRequested; //版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//ver1.1版本的套接字
err = WSAStartup( wVersionRequested, &wsaData );//加载winsocket库
//WSAStartup作用:加载套接字库,并进行套接字库的版本协商
if ( err != 0 )
{
return;
} //加载套接字库,如果失败返回0
//判断高低字节是不是1,如果不是1.1版本则退出
if ( LOBYTE( wsaData.wVersion ) != 1 || //low ver
HIBYTE( wsaData.wVersion ) != 1 ) //high ver
{
WSACleanup( ); //释放winsocket库
return;
}
/*-------2、创建流式监听socket,基于TCP--------*/
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
/*---3、将套接字绑定到一个本地地址和端口上(bind)----*/
SOCKADDR_IN addrSrv; //创建一个地址结构体变量
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//给出的是套接字的主机IP地址
addrSrv.sin_family=AF_INET;//指定地址族
addrSrv.sin_port=htons(6000);//指定端口号
//将套接字绑定到一个本地地址和端口号上
(因为定义的结构体类型是SOCKADDR_IN ,而参数需要的是 SOCKADDR,所以我们需要强制转换)
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
/*-----4、将套接字设为监听模式,准备接收客户请求(listen)-----*/
listen(sockSrv,10);//监听
SOCKADDR_IN addrClient; //定义一个用来接收客户端socket的结构体
int len=sizeof(SOCKADDR); //初始化参数,这个参数必须进行初始化
//循环等待接受客户端发送请求
while(1)
{
/*------5、等待客户端的请求到来,当请求到来后,接受连接请求,返回一个新的对应
于此连接的套接字(accept),此时程序在此发生阻塞---------------*/
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//创建连接套接字
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to C++",inet_ntoa(addrClient.sin_addr)); //格式化输出
/*------6、用返回的套接字和客户端进行通信-------*/
send(sockConn,sendBuf,strlen(sendBuf)+1,0); //多发送一个字节
//接收数据
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
/*----8、关闭连接套接字---*/
closesocket(sockConn);
}
}
TCP客户端代码如下:
#include<winsock2.h>
#include<stdio.h>
void main()
{
/*--------1、加载套接字库 -------*/
WORD wVersionRequested; //版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//ver1.1版本的套接字
err = WSAStartup( wVersionRequested, &wsaData );//加载winsocket库
if ( err != 0 )
{ //版本协商
return;
} //加载套接字库,如果失败返回0
if ( LOBYTE( wsaData.wVersion ) != 1 || //low ver
HIBYTE( wsaData.wVersion ) != 1 ) //high ver
{
return;
}
/*-------2、创建流式监听socket,基于TCP--------*/
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
/*----------3、向服务器发送连接诶请求--------*/
SOCKADDR_IN addrSrv;//定义地址结构体变量
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//转换字符型为网络字节序格式
//设定服务器的IP地址
//addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.3");//给出的是套接字的主机IP地址
addrSrv.sin_family=AF_INET;//地址族
addrSrv.sin_port=htons(6000);//端口
//客户端无需绑定,可直接连接服务端,故connect()的第二个参数必须填写服务器端的地址信息
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
/*--------4、和服务器进行通信(send/recv)-----*/
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"Hello",strlen("Hello")+1,0);
/*------关闭连接套接字----------*/
closesocket(sockClient);
WSACleanup();//释放winsocket库
}
本文详细介绍了TCP服务器与客户端的通信过程,包括服务器端的套接字库加载、套接字创建、绑定地址和端口、监听及接受连接,以及客户端的套接字创建、连接请求和通信步骤。通过具体代码示例,展示了基于Winsock的TCP通信实现。
5496

被折叠的 条评论
为什么被折叠?



