【MFC】socket网络编程示例

【MFC】socket网络编程示例


MFC socket网络编程(流程示例)

1.TCP流式套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!

服务器端程序:

1、加载套接字库
2、创建套接字(socket)。
3、将套接字绑定到一个本地地址和端口上(bind)。
4、将套接字设为监听模式,准备接收客户请求(listen)。
5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
6、用返回的套接字和客户端进行通信(send/recv)。
7、返回,等待另一客户请求。
8、关闭套接字。

客户端程序:

1、加载套接字库
2、创建套接字(socket)。
3、向服务器发出连接请求(connect)。
4、和服务器端进行通信(send/recv)。
5、关闭套接字。

服务器端代码如下:

#include <Winsock2.h>//加裁头文件 
#include <stdio.h>//加载标准输入输出头文件 
void main()
{ 
WORD wVersionRequested;//版本号 
WSADATA wsaData; 
int err; 
wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字 
err = WSAStartup( wVersionRequested, &wsaData ); 
if ( err != 0 ) { return; }//加载套接字库,加裁失败则返回 
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) 
{ 
WSACleanup( );
return; 
}//如果不是1.1的则退出 
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。 
SOCKADDR_IN addrSrv; 
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式 addrSrv.sin_family=AF_INET; 
addrSrv.sin_port=htons(6000); 
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //将套接字绑定到一个本地地址和端口上(bind) listen(sockSrv,5);//将套接字设为监听模式,准备接收客户请求(listen)。 
SOCKADDR_IN addrClient;//定义地址族 
int len=sizeof(SOCKADDR);//初始化这个参数,这个参数必须被初始化 
while(1) 
{ 
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //accept的第三个参数一定要有初始值。 //等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。 //此时程序在此发生阻塞 
char sendBuf[100]; 
sprintf(sendBuf,"Welcome %s to www.msn.com.cn",inet_ntoa(addrClient.sin_addr)); //用返回的套接字和客户端进行通信(send/recv)。 
send(sockConn,sendBuf,strlen(sendBuf)+1,0); 
char recvBuf[100]; 
recv(sockConn,recvBuf,100,0); 
printf("%s\n",recvBuf); 
closesocket(sockConn);//关闭套接字。等待另一个用户请求 
} 
}

客户端代码如下:

#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 sockClient=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。 
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); 
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//向服务器发出连接请求(connect)。 
char recvBuf[100];//和服务器端进行通信(send/recv)。 
recv(sockClient,recvBuf,100,0); 
printf("%s\n",recvBuf); 
send(sockClient,"This is blues_j",strlen("This is blues_j")+1,0); 
closesocket(sockClient);//关闭套接字。 
WSACleanup();//必须调用这个函数清除参数 
}

2.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> 
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; 
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 
addrSrv.sin_family=AF_INET; 
addrSrv.sin_port=htons(6000); 
sendto(sockClient,"Hello",strlen("Hello")+1,0, (SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); 
closesocket(sockClient); 
WSACleanup(); 
}

3.聊天程序常用的是UDP式套接字。因为TCP的三步握手开销比较大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值