歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++基於TCP和UDP的socket通信

C++基於TCP和UDP的socket通信

日期:2017/4/19 14:16:59   编辑:Linux編程

C++基於TCP和UDP的socket通信,以下是關於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();
}

Copyright © Linux教程網 All Rights Reserved