一、套接字类型
1、流式套接字(SOCK_STREAM)TCP
2、数据报式套接字(SOCK_DGRAM)UDP
3、原始套接字(SOCK_RAM)
二、通信过程
TCP方式:
服务器端:
1、创建套接字(socket)
2、将套接字绑定到一个本地地址和端口上(bind)
3、将套接字设为监听模式,准备接收客户请求(listen)
4、等待客户请求到来:当请求到来后,接收连接请求,返回一个新的对应此次连接的套接字(accept)
5、用返回的套接字和客户端进行通信(send/recv)
6、返回,等待另一客户请求
7、关闭套接字
客户端:
1、创建套接字(socket)
2、向服务器发出连接请求(connect)
3、和服务器端进行通信(send/recv)
4、关闭套接字
UDP方式:
服务器端:
1、创建套接字(socket)
2、将套接字绑定到一个本地地址和端口上(bind)
3、等待接收数据(recvfrom)
4、关闭套接字
客户端:
1、创建套接字(socket)
2、向服务器端发送数据(sendto)
3、关闭套接字
三、具体实现
TCP方式:
Φ获取套接字库,所有方式必须!
Server:
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1); //版本1.1
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
//低字节,高字节
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) !=1)
{
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
}
else
printf("The Winsock 1.1 dll was found okay\n");
//创建服务器套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
//地址结构体
SOCKADDR_IN addrSrv;
//htonl 转为网络字节序(设置地址为任意)
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
//htons usigned int转为网络字节序,设置端口
addrSrv.sin_port=htons(6000);
//绑定
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//监听客户端请求,最大并发数为5
listen(sockSrv,5);
//获取客户端IP
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
//服务器 死循环
while(1)
{
SOCKET sockCon=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char buff[100];
sprintf(buff,"tanhp.com",inet_ntoa(addrClient.sin_addr));
//发送数据
send(sockCon,buff,strlen(buff)+1,0);
//接收数据
recv(sockCon,buff,100,0);
printf("%s\n",buff);
closesocket(sockCon);
}
Client:
//创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
//IP地址
SOCKADDR_IN addrSrv;
//本地IP
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char buff[100];
recv(sockClient,buff,100,0);
printf("%s\n",buff);
send(sockClient,"this is client",strlen("this is client")+1,0);
closesocket(sockClient);
WSACleanup();
UDP方式:
Server:
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
//套接字,地址
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char buff[100];
//接收
recvfrom(sockSrv,buff,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",buff);
//发送
sendto(sockSrv,"server",strlen("server")+1,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
closesocket(sockSrv);
WSACleanup();
Client:
//创建套接字
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
//发送
sendto(sockSrv,"client",strlen("client")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//接收
char buff[100];
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,buff,100,0,(SOCKADDR*)&addrSrv,&len);
printf("%s\n",buff);
closesocket(sockSrv);
WSACleanup();