设为首页 加入收藏

TOP

C++基于TCP和UDP的socket通信
2015-11-10 13:45:40 来源: 作者: 【 】 浏览:7
Tags:基于 TCP UDP socket 通信

C++基于TCP和UDP的socket通信,以下是关于socket编程的一个非常经典的例子:


服务端:


#include
#include //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
#include


#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();
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java反射机制浅析 下一篇Java反射技术详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: