c++ linux socket udp tcp 区别,C++基于TCP和UDP的socket通信

本文展示了C++中使用TCP和UDP协议进行socket通信的实例代码。服务端通过WSAStartup初始化,创建并绑定socket,监听4000端口,等待客户端连接。客户端同样初始化后,连接服务端指定IP的4000端口,发送和接收数据。此示例详细解释了socket编程的基本步骤。
摘要由CSDN通过智能技术生成

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

}

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值