网络编程(windows socket编程)
Posted cainiao-xf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程(windows socket编程)相关的知识,希望对你有一定的参考价值。
TCP服务器端代码:
1 // TcpSrv.cpp: 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<Windows.h> 6 #pragma comment(lib,"ws2_32.lib") 7 8 int main() 9 { 10 //************加载套接字库***************** 11 WORD wVersionRequested; 12 WSADATA wsaData; 13 int err; 14 15 wVersionRequested = MAKEWORD(2,2);//Winsock库版本,低字节代表主版本,高字节代表副版本 16 err = WSAStartup(wVersionRequested, &wsaData); 17 if (err != 0) 18 { 19 return false; 20 } 21 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) 22 { 23 WSACleanup();//终止对winsock库的使用 24 return false; 25 } 26 27 //***********创建套接字******************** 28 29 //parameter int af:指定协议族,即网际域,Windows平台总是AF_INET或TF_INET 30 //parameter int type:套接字类型 31 //parameter int protocal:协议类型,一般设为0,自动设置 32 SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); 33 34 //************绑定到本机地址和端口*********** 35 SOCKADDR_IN addrSrv;//本机地址结构体信息,除了sin_family,其它字段都需要采用网络字节序 36 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//htonl转换为网络字节序,转换的是u_long类型 37 addrSrv.sin_family = AF_INET; 38 addrSrv.sin_port = htons(6000);//htons转换为网络字节序,转换的是u_short类型 39 40 //绑定,由于第二个参数会随网络协议的不同而变化,所以第三个参数指定地址结构的长度 41 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(addrSrv)); 42 43 //*************监听************************ 44 listen(sockSrv,5);//5表示连接队列 45 46 while (1) 47 { 48 SOCKADDR_IN addrClient;//用于接收客户端的地址信息 49 int len = sizeof(SOCKADDR);//这个参数必须初始化 50 51 //*************建立连接************************ 52 //接受客户端的连接,返回一个新的套接字。之前的套接字sockSrv依然用于监听 53 SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len); 54 55 //*************发送数据************************ 56 char sendBuf[100]; 57 //inet_ntoa表示将网络用的ip地址转换为点分十进制的形式,并返回成字符串 58 //inet_addr将点分十进制地址转换为一个无符号整形表示形式 59 sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr)); 60 61 send(sockConn, sendBuf, strlen(sendBuf) + 1,0); 62 63 //*************接收数据************************ 64 char recvBuf[100]; 65 recv(sockConn,recvBuf,100,0); 66 printf("%s",recvBuf); 67 68 //*************关闭套接字********************** 69 closesocket(sockConn); 70 } 71 // 退出while循环后,关闭sockSrv以及清理套接字即可 72 73 return 0; 74 }
TCP客户端端代码:
1 // TcpClient.cpp: 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<Winsock2.h> 6 #pragma comment(lib,"ws2_32.lib") 7 int main() 8 { 9 //************加载套接字库***************** 10 WORD wVersionRequested; 11 WSADATA wsaData; 12 int err; 13 wVersionRequested = MAKEWORD(2,2); 14 err = WSAStartup(wVersionRequested,&wsaData); 15 if (err != 0) 16 { 17 return false; 18 } 19 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) 20 { 21 WSACleanup(); 22 return false; 23 } 24 25 //***********创建套接字******************** 26 SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0); 27 28 //************连接服务器******************* 29 SOCKADDR_IN addrSrv; 30 addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 31 addrSrv.sin_family = AF_INET; 32 addrSrv.sin_port = htons(6000); 33 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); 34 35 //************接收数据********************* 36 char recvBuf[100]; 37 recv(sockClient,recvBuf,100,0); 38 printf("%s ",recvBuf); 39 //************发送数据********************* 40 send(sockClient,"This is Client",strlen("This is Client")+1,0); 41 42 closesocket(sockClient);//关闭套接字 43 WSACleanup();//终止套接字库的使用 44 45 system("pause"); 46 return 0; 47 }
UDP服务端代码:
1 // udpSrv.cpp: 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<WinSock2.h> 6 #pragma comment(lib, "ws2_32.lib") 7 int main() 8 { 9 //*************加载套接字库*************** 10 WORD wVersionRequested; 11 WSADATA wsaData; 12 int err; 13 14 wVersionRequested = MAKEWORD(2, 2); 15 err = WSAStartup(wVersionRequested,&wsaData); 16 17 if (err != 0) 18 { 19 return false; 20 } 21 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) 22 { 23 return false; 24 WSACleanup(); 25 } 26 27 //*************创建套接字*************** 28 SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0); 29 30 //*************绑定到地址结构上*************** 31 SOCKADDR_IN addrSrv; 32 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 33 addrSrv.sin_family = AF_INET; 34 addrSrv.sin_port = htons(6000); 35 36 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(addrSrv)); 37 38 //*************接收******************** 39 SOCKADDR_IN addrClient; 40 int len = sizeof(SOCKADDR); 41 char recvBuf[100]; 42 recvfrom(sockSrv, recvBuf,100,0,(SOCKADDR*)&addrClient,&len); 43 printf("%s ", recvBuf); 44 45 //*************关闭套接字*************** 46 closesocket(sockSrv); 47 WSACleanup(); 48 49 system("pause"); 50 return 0; 51 }
UDP客户端代码:
1 // udpClient.cpp: 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<WinSock2.h> 6 #pragma comment(lib, "ws2_32.lib") 7 8 int main() 9 { 10 //*************加载套接字库*************** 11 WORD wVersionRequested; 12 WSADATA wsaData; 13 int err; 14 15 wVersionRequested = MAKEWORD(2, 2); 16 err = WSAStartup(wVersionRequested, &wsaData); 17 18 if (err != 0) 19 { 20 return false; 21 } 22 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) 23 { 24 return false; 25 WSACleanup(); 26 } 27 //****************创建套接字*********************** 28 SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0); 29 30 //****************发送数据*********************** 31 SOCKADDR_IN addrSrv; 32 addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 33 addrSrv.sin_family = AF_INET; 34 addrSrv.sin_port = htons(6000); 35 int len = sizeof(SOCKADDR); 36 37 sendto(sockClient,"hello",sizeof("hello")+1,0,(SOCKADDR*)&addrSrv,len); 38 39 //****************关闭套接字*********************** 40 closesocket(sockClient); 41 WSACleanup(); 42 43 system("pause"); 44 return 0; 45 }
以上是关于网络编程(windows socket编程)的主要内容,如果未能解决你的问题,请参考以下文章
Python网络编程之socket之send和recv原理剖析