Windows下VC编程(SOCKET)
2016-08-23 17:20
423 查看
一、原理
1.基于TCP协议的服务器端程序流程:
1)创建套接字(socket)
2)绑定套接字(bind)
3)将套接字设为监听,准备接收客户请求(listen)
4)等待客户请求的到来,当请求到来后,接受请求,返回一个对应于此次连接的套接字(accept)
5)用返回的套接字与客户端进行通信(send/recv)
6)返回,等待另一客户请求
7)关闭套接字
2.基于TCP协议的客户端程序流程
1)创建套接字(socket)
2)向服务器发出连接请求(connect)
3)和服务器端进行通信(send/recv)
4)关闭套接字
在服务器端调用accept函数时,程序就会等待客户端调用connect函数发出连接请求,然后接收请求,于是
双方就建立了连接,之后,服务器端和客户端就可以利用send和recv函数进行通信了。
3.基于UDP的服务器端编写
1)创建套接字(socket)
2)绑定(bind)
3)等待接收数据(recvfrom)
4)关闭套接字
4.基于UDP的客户端编写
1)创建套接字(socket)
2)向服务器发送数据(sendto)
3)关闭套接字
在所有的套接字编程中第一步都是加载套接字库(WSAStartup)
对于每一个WSAStartup函数的成功调用,在最后都要对应一个WSACleanUp调用。
二、源码:
1.TCP服务器端:
2.TCP客户端:
3.UDP服务器端
4.UDP客户端
1.基于TCP协议的服务器端程序流程:
1)创建套接字(socket)
2)绑定套接字(bind)
3)将套接字设为监听,准备接收客户请求(listen)
4)等待客户请求的到来,当请求到来后,接受请求,返回一个对应于此次连接的套接字(accept)
5)用返回的套接字与客户端进行通信(send/recv)
6)返回,等待另一客户请求
7)关闭套接字
2.基于TCP协议的客户端程序流程
1)创建套接字(socket)
2)向服务器发出连接请求(connect)
3)和服务器端进行通信(send/recv)
4)关闭套接字
在服务器端调用accept函数时,程序就会等待客户端调用connect函数发出连接请求,然后接收请求,于是
双方就建立了连接,之后,服务器端和客户端就可以利用send和recv函数进行通信了。
3.基于UDP的服务器端编写
1)创建套接字(socket)
2)绑定(bind)
3)等待接收数据(recvfrom)
4)关闭套接字
4.基于UDP的客户端编写
1)创建套接字(socket)
2)向服务器发送数据(sendto)
3)关闭套接字
在所有的套接字编程中第一步都是加载套接字库(WSAStartup)
对于每一个WSAStartup函数的成功调用,在最后都要对应一个WSACleanUp调用。
二、源码:
1.TCP服务器端:
#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_STREAM,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)); listen(sockSrv,5); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) { SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf[100]; sprintf(sendBuf,"Welcome %s to http://weigongwan.cublog.cn", inet_ntoa(addrClient.sin_addr)); 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); 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)); char recvBuf[100]; recv(sockClient,recvBuf,100,0); printf("%s\n",recvBuf); send(sockClient,"This is lisi",strlen("This is lisi")+1,0); closesocket(sockClient); 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 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(); } |
4.UDP客户端
#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(); } |
相关文章推荐
- windows vc socket编程
- ftp客户端源代码,使用VC+SOCKET编程,在SERV-U6.0服务器上测试通过,能断点续传
- VC++ 网络SOCKET编程
- VC++ Windows平台字符透明编程大总结 - [C/C++]
- [转]vc中socket编程步骤
- VC++ Socket编程 简单的Tcp/ip服务器
- UDP Socket编程 C/C++实现 (Windows Platform SDK)
- VC++ 外壳扩展编程之windows右键菜单
- VC++ Windows平台字符透明编程大总结
- Windows下Openssl安装以及编程(VC.net环境)
- [转]vc中socket编程步骤
- 在VC中使用Windows管道技术编程
- 用Visual C++ 4.0 实现Windows 95 Socket编程
- 求助:学习 -- C++ -- VC++,windows编程各阶段需要看哪些书
- 我理解的windows异常处理 - VC++ - 中国代码网 -中国第一编程技术与源码下载站
- VC++ Windows平台字符透明编程大总结(转)
- vc socket编程中,winsock2环境初始化问题。
- VC SOCKET 编程小示例
- vc中socket编程步骤
- Windows下Openssl安装以及编程(VC.net环境)