Windows网络编程


1.先总结一些会用到的知识

 IP地址:IPV4中计算机都分配一个地址,该地址是一个32位的数值表示;客户端和服务器通信的时候需要指定一个IP地址和端口。
      IP地址一般是用“Internet点分表示a.b.c.d一样指定的,每一个字母代表一个字节的数字(十进制、八进制
          或十六进制)从左到右分配了一个无符号长整数4字节。 

unsigned long inet_addr(_In_ const char *cp) 一个点分IP地址转换成一个32的无符号长整数。
网络字节序:TCP/IP协议中规定好的数据表示方法,顺序采用big endian排序方式;
主机字节序:主机表示数据的方法,不同的操作系统字节序不同,有big endian,有的是little endian ;若是主机字节序与网络字节序不同,则需 
            要转换成一致的字节序;
转换字节序用到的函数:
                  网络字节序——主机字节序                      主机字节序——网络字节序

ntohl htonl WSANtohl WSAHtonl

ntohs htons

WSANtohs WSAHtons

SOCKADDR_IN结构:来指定IP地址和服务端口信息。

struct sockaddr_in

{

    short  sin_family; //    协议族   一般为AF_INET

    u_short  sin_port;     //   端口号,必须使用网络字节序

     struct   in_addr  sin_addr; //IP地址信息

     char     sin_zero[8]; //为了使sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节

}

2.面向连接的TCP协议编程

1)服务器端程序

#include
#include
#include
 
#pragma comment(lib,"Ws2_32")//添加库文件
 
using namespace std;
 
int main()
{
	//1.创建套接字(socket)
	WORD version =MAKEWORD(2,2);//先确定使用套接字的版本
	WSADATA wdata;
	int erro =WSAStartup(version,&wdata);//启动套接字
	if(erro!=0)
	{
		cout<<"套接字启动失败!"<

 

2.客户端的程序

    

#include

#include

 

 

#pragma comment(lib,"Ws2_32")

 

using namespace std;

 

int main()

{

//客户端

 //1.创建套接字

WSADATA wsd;

wsd.wVersion=MAKEWORD(2,2);//确定套接字的版本

int erro;

erro=WSAStartup(wsd.wVersion,&wsd);

if(erro!=0)

{

  cout<<"套接字启动失败!"<

}

if((LOBYTE(wsd.wVersion)!=2)||(HIBYTE(wsd.wVersion)!=2))

{

    cout<<"套接字版本错误!"<

WSACleanup();

}

SOCKET Clientsocket = socket(AF_INET,SOCK_STREAM,0);

 

SOCKADDR_IN  Servadd;

Servadd.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

Servadd.sin_family=AF_INET;

Servadd.sin_port=htons(6000);

 

//2.向服务器发送连接请求(connect)

connect(Clientsocket,(sockaddr*)&Servadd,sizeof(sockaddr));//套接字,服务器IP地址,地址结构体的长度

 

//3.与服务器通信(send/recv)

char sendbuf[100],recvbuf[100];

  while(1)

  {

  Sleep(10000);

     recv(Clientsocket,recvbuf,100,0);

 cout<<"receive :"<

 send( Clientsocket,"this is client",strlen("this is client")+1,0);

     

 closesocket(Clientsocket);

// WSACleanup();

  

  }

 

system("pause");

return 0;

}


 

以上是使用TCP协议的简单编程,TCP是面向连接的通信,是协议,UDP是无连接通信,几乎是基于消息的因此在接收函数的调用必须提供一个足够大的缓冲空间,如果缓冲区不够大,接收调用会失败,出现错误WSAEMSGSIZE缓冲区填满,未接收完的数据会丢弃

//Udp服务器
#include
#include

#pragma comment(lib,"Ws2_32")
using  namespace std;

int main()
{
	//服务器端
	//1.创建套接字
    DWORD wversion;
	wversion =MAKEWORD(2,2);
	WSADATA wsa;
	wsa.wVersion=wversion;
	int erro=0;
	erro= WSAStartup(wversion,&wsa);
	if(erro!=0)
	{
	    cout<<"套接字启动失败!"<
UDP客户端

#include
#include

#pragma comment(lib,"Ws2_32")
using  namespace std;

int main()
{
	//服务器端
	//1.创建套接字
    DWORD wversion;
	wversion =MAKEWORD(2,2);
	WSADATA wsa;
	wsa.wVersion=wversion;
	int erro=0;
	erro= WSAStartup(wversion,&wsa);
	if(erro!=0)
	{
	    cout<<"套接字启动失败!"<

这些是最基础,最简单的编程,实际应用中要更加复杂,慢慢 结。

你可能感兴趣的:(C++,MFC)