客户端与服务器端的通讯,C++书写步骤。

客户端与服务器端的通讯,C++书写步骤。,第1张

要实现客户端服务器端的通讯,需要两部分C++的程序:服务器端程序代码和客户端代码。

首先是服务器端程序代码:

#include <WinSock2.h>

#include <stdio.h>

#include <stdlib.h> 

#pragma comment(lib, "ws2_32.lib")

void main()

{

WSADATA wsaData

int port = 5099

char buf[] = "Server: hello, I am a server....."

if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)

{

printf("Failed to load Winsock")

return

//创建用于监听的套接字

SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0)

SOCKADDR_IN addrSrv

addrSrv.sin_family = AF_INET

addrSrv.sin_port = htons(port)//1024以上的端口号

addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY)

int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN))

if(retVal == SOCKET_ERROR){

printf("Failed bind:%d\n", WSAGetLastError())

return

}

if(listen(sockSrv,10) ==SOCKET_ERROR){

printf("Listen failed:%d", WSAGetLastError())

return

}

SOCKADDR_IN addrClient

int len = sizeof(SOCKADDR)

while(1)

{

//等待客户请求到来

SOCKET sockConn = accept(sockSrv, (SOCKADDR *) &addrClient, &len)

if(sockConn == SOCKET_ERROR){

printf("Accept failed:%d", WSAGetLastError())

break

}

printf("Accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr))

//发送数据

int iSend = send(sockConn, buf, sizeof(buf) , 0)

if(iSend == SOCKET_ERROR){

printf("send failed")

break

}

char recvBuf[100]

memset(recvBuf, 0, sizeof(recvBuf))

//      //接收数据

recv(sockConn, recvBuf, sizeof(recvBuf), 0)

printf("%s\n", recvBuf)

closesocket(sockConn)

}

closesocket(sockSrv)

WSACleanup()

system("pause")

}

接下来是客户端代码:

#include <WinSock2.h> 

#include <stdio.h>

#pragma comment(lib, "ws2_32.lib")

void main()

{

//加载套接字

WSADATA wsaData

char buff[1024]

memset(buff, 0, sizeof(buff))

if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)

{

printf("Failed to load Winsock")

return

}

SOCKADDR_IN addrSrv

addrSrv.sin_family = AF_INET

addrSrv.sin_port = htons(5099)

addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1")

//创建套接字

SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0)

if(SOCKET_ERROR == sockClient){

printf("Socket() error:%d", WSAGetLastError())

return

}

//向服务器发出连接请求

if(connect(sockClient, (struct  sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET){

printf("Connect failed:%d", WSAGetLastError())

return

}else

{

//接收数据

recv(sockClient, buff, sizeof(buff), 0)

printf("%s\n", buff)

}

//发送数据

char buff = "hello, this is a Client...."

send(sockClient, buff, sizeof(buff), 0)

//关闭套接字

closesocket(sockClient)

WSACleanup()

}

打开背包向服务器申请数据服务器下发被背包内的物品 ID 、Count(结构体形式以List发送到客户端)

客户端根据接受的ID、Count去本地配置表中配置物品然后显示在背包中

(从服务器接受后在本地查找ID对应的图片 属性 类型后加入Count显示在背包中)

点击物品,将物品ID发送到服务器,服务器扣除物品数量,并将使用物品后所需的效果(如 增加经验、属性等),增加完毕之后将数值返回给客户端,客户端更新背包内容并将对应属性同步刷新显示(如果物品用完 将物品从储存的List中将物品进行删除操作)

服务器向背包发送ID、Count,在本地配置表中生成后 刷新显示到背包中。

客户端发送 角色ID 到客户端,客户端在库中搜索角色

         (1).玩家2同意添加好友,玩家2客户端向服务器发送消息,服务器将两 人绑定为好友关系,将数据(玩家ID等)下发到双方客户端,并刷新 显示双方客户端好友列表。

         (2).玩家2拒绝添加好友,玩家2客户端向服务器发送消息,服务器向玩 家1发送消息,玩家1客户端显示被拒绝消息提醒。

玩家1向服务器发送消息,服务器取消双方好友关系的绑定,并将数据发回双方客户 端,客户端更新显示好友框。

通常以动态生成和隐藏方式显示,只显示上下5个范围内容。。。。。

客户端向服务器发送消息,服务器判断当前时间,并判断当天是否签到过,如未签到 过,向客户端发送信息,客户端显示签到成功,并修改签到按钮为已经签到,如需领 取签到奖励,参考背包获得物品。

服务器记录账号签到天数,如需要补签将补签日期ID发送到服务器,服务器判定当 天是否签到,未签到则执行签到操作,获取奖励物品。

服务器向客户端发送消息(邮件名、邮件内容、是否有附件、附件ID、Count),客 户端接受信息后显示有新邮件的提示,在本地配置表中填入接受的消息,并显示在邮 件中。客户端点击领取附件(向服务器发送消息,已经领取),并且做背包操作,参 考背包系统获取物品。

玩家1编辑邮件,点击发送按钮,将邮件(名称、内容、是否有附件、附件、收件 人)发送到服务器,服务器在库中索搜收件人,然后参考系统附件邮件操作。

三次握手,四次挥手。

第一次握手:客户端向服务器端发送连接请求包SYN,等待服务器回应;

第二次握手:服务器端收到客户端连接请求包SYN后,将客户端的请求包SYN放入到自己的未连接队列,此时服务器需要发送两个包给客户端;

(1)向客户端发送确认自己收到其连接请求的确认包ACK,向客户端表明已知道了其连接请求

(2)向客户端发送连接询问请求包SYN,询问客户端是否已经准备好建立连接,进行数据通信;即在第二次握手时服务器向客户端发送ACK和SYN包,此时服务器进入SYN-RCVD状态。

第三次握手:客户端收到服务器的ACK和SYN包后,知道了服务器同意建立连接,此时需要发送连接已建立的消息给服务器;向服务器发送连接建立的确认包ACK,回应服务器的SYN告诉服务器,我们之间已经建立了连接,可以进行数据通信。ACK包发送完毕,服务器收到后,此时服务器与客户端进入ESTABLISHED状态,开始进行数据传送。

TCP四次挥手过程

断开一个tcp连接需要“四次挥手”

第一次:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发送数据了,但是,此时,主动关闭方依然可以接收数据。

第二次:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1.

第三次:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我已经发完了,不会再给你发数据了。

第四次:主动关闭方收到FIN后,发送一个ACK给对方,确认序号为收到序号+1,至此,四次挥手完成。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/352938.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-08
下一篇2023-05-08

发表评论

登录后才能评论

评论列表(0条)

    保存