客户端与服务器端的通讯,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()

}

服务器和客户端在通信之前会先建立TCP连接,就是常说的三次握手过程。

TCP连接建立之后,服务器和客户端就可以互通数据了,可以通过HTTP、FTP、SMTP等等的协议进行各种应用,服务器有通用的服务端口,例如80是HTTP服务,21是FTP服务,25是SMTP服务,这些端口号是通用的。而用户的端口号则是不确定的。所以,客户端需要某种服务时会先访问服务器的某个端口,并且通过TCP建立过程,告知服务器自己的端口号。

正如你所说的,黑客可以对客户端伪装成服务器、对服务器伪装成客户端,分别建立TCP连接,然后获取用户和服务器的信息。现在很多钓鱼陷阱就是这样盗取用户帐号、密码的。

木马攻击又是另外一回事了,木马主要是把木马程序载入用户电脑,然后盗取用户信息,当然通过中间人攻击来注入木马是常用的手段。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存