MFC用CSocket写简易聊天软件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/songqiu65/article/details/70252528

CSocket通信原理:TCP/IP
服务器端
1.创建一个socket套接字(用于监听)
2.获取服务器IP(本地IP)IP和端口端口(大于1024的端口)
3.开始监听
4.监听到有客户端连接服务器之后,创建一个新的socket套接字(用于通讯),用于和客户端之间的通信(继续监听)
5.用新的socket套接字和客户端进行通信
6.send();//发送消息
Receive();//接收消息
创建->绑定端口->监听->创建通信的socket->通信->关闭服务器
|
监听

客户端
1.创建一个socket套接字
2.根据服务器的IP地址和通信端口连接服务器
3.通过已经创建的socket套接字和客户端进行通信
4.send();//发送消息
Receive();//接收消息
5.关闭客户端 close();
创建->连接服务器->通信->关闭

UDP型套接字
服务器端(接收端)程序:

1、创建套接字(socket)。
2、将套接字绑定到一个本地地址和端口上(bind)。
3、等待接收数据(recvfrom)。
4、关闭套接字。 客户端(发送端)程序:
1、创建套接字(socket)。
2、向服务器发送数据(sendto)。
3、关闭套接字。

服务器端代码:

#include <Winsock2.h> 
#include <stdio.h> 
void main() 
{ 
WORD wVersionRequested; 
WSADATA wsaData; 
int err; 
wVersionRequested = MAKEWORD( 1, 1 ); 
err = WSAStartup( wVersionRequested, &wsaData ); 
if ( err != 0 ) { return; } 
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 
{ 
WSACleanup( ); 
return; 
} 
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 recvBuf[100]; 
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); 
printf("%s\n",recvBuf); 
closesocket(sockSrv); WSACleanup(); 
}

客户端代码:

#include <Winsock2.h> 
#include <stdio.h> 
#include <Ws2tcpip.h> 
#pragma comment(lib,"WS2_32.lib")
void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD(1, 1);
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0) { return; }
	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
	{
		WSACleanup();
		return;
	}
	SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
	SOCKADDR_IN addrSrv;
	InetPton(AF_INET,"127.0.0.1", (void *)&addrSrv.sin_addr.S_un.S_addr);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	sendto(sockClient, "Hello", strlen("Hello") + 1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
	closesocket(sockClient);
	WSACleanup();
}

q1:无法解析的外部符号
a1:在include后加一行#pragma comment(lib,“WS2_32.lib”)
q2:error C4996: ‘inet_addr’
a2:1.项目->属性->C/C+±>常规->SDL检查,将“是”改为“否”
2.使用新函数InetPton()(客户端里面有使用实例)

猜你喜欢

转载自blog.csdn.net/songqiu65/article/details/70252528
今日推荐