C++基于TCP和UDP的socket通信
2015-10-01 16:24
501 查看
以下是关于socket编程的一个非常经典的例子:
服务端:
客户端:
服务端:
#include <stdio.h> #include <Winsock2.h> //windows socket的头文件 #pragma comment( lib, "ws2_32.lib" )// 链接Winsock2.h的静态库文件 void main() { //初始化winsocket WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节 err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。 if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容 { WSACleanup( ); return; } SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,对应tcp;0指定网络协议为TCP/IP SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //htonl用来将主机字节顺序转换为网络字节顺序(to network long) //INADDR_ANY就是指定地址为0.0.0.0的地址, //表示不确定地址,或“任意地址”。” addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(4000);//htons用来将主机字节顺序转换为网络字节顺序(to network short) bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将本地地址绑定到所创建的socket上,以使在网络上标识该socket listen(sockSrv,5);//socket监听,准备接受连接请求。 SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) { SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//为一个连接请求提供服务。addrClient包含了发出连接请求的客户机IP地址信息;返回的新socket描述服务器与该客户机的连接 char sendBuf[50]; sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));//inet_ntoa网络地址转换转点分十进制的字符串指针 send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[50]; recv(sockConn,recvBuf,50,0); printf("%s\n",recvBuf); closesocket(sockConn); Sleep(2000);//2000毫秒 } WSACleanup(); }
客户端:
#include <stdio.h> #include <Winsock2.h> #pragma comment( lib, "ws2_32.lib" ) void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节 err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。 if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容 { WSACleanup( ); return; } for(int index=0;;index++) { SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrClt;//需要包含服务端IP信息 addrClt.sin_addr.S_un.S_addr=inet_addr("192.168.0.30");// inet_addr将IP地址从点数格式转换成网络字节格式整型。 addrClt.sin_family=AF_INET; addrClt.sin_port=htons(4000); connect(sockClient,(SOCKADDR*)&addrClt,sizeof(SOCKADDR));//客户机向服务器发出连接请求 char recvBuf[50]; recv(sockClient,recvBuf,50,0); printf("my reply is : %s\n",recvBuf); char sendBuf[50]; sprintf(sendBuf,"%3d,",index); strcat(sendBuf,"server node of: yaopeng"); send(sockClient,sendBuf,strlen(sendBuf)+1,0); closesocket(sockClient); Sleep(2000); } WSACleanup(); }
相关文章推荐
- 传输层:TCP 协议,转载自实验楼
- TCP/IP学习笔记
- 使用netstat检测及监测网络连接
- ECharts+BaiduMap+HT for Web网络拓扑图应用
- 安卓 AsyncHttpClient - “Content-Type not allowed!”
- ECharts+BaiduMap+HT for Web网络拓扑图应用
- 秒针系统网络广告交易平台介绍
- 秒针系统网络广告交易平台介绍
- 秒针系统网络广告交易平台介绍
- [网络和多线程]7、主队列
- 网络通信 --> TCP三次握手和四次挥手
- Apache HTTP Server2.4安装
- NetWorkTool工具类之网络请求
- 构建高性能WEB之HTTP首部优化
- httpget
- TCP/IP协议原理与应用笔记11:TCP/IP中地址与层次关系
- TCP浅谈(上)
- TCP/IP相关知识点
- 理解HTTP/304响应
- 妈咪212网络搜索功能,打开它