网络编程笔记

#include <Winsock2.h>
#include <stdio.h>
void main()
{
	//加载socket库 
	WORD wVersionRequested;//16-bit unsigned integer.VC中的16进制的无符号整数。
	WSAData wsaDATA;
	int err;
	/************************************************************************
	struct WSAData {
	WORD wVersion;
	WORD wHighVersion;
	char szDescription[WSADESCRIPTION_LEN+1];
	char szSystemStatus[WSASYSSTATUS_LEN+1];
	unsigned short iMaxSockets;
	unsigned short iMaxUdpDg;
	char *lpVendorInfo;
	};
    WSADATA结构被用来保存AfxSocketInit函数返回的Windows Sockets初始化信息。
	http://baike.baidu.com/view/2297317.htm
	*************************************************************************/

	wVersionRequested = MAKEWORD(1,1);//这个宏创建一个无符号16位整形,通过连接两个给定的无符号参数。
	
	err = WSAStartup(wVersionRequested,&wsaDATA);
	if (err!=0)
	{
		return;
	}
	if (LOBYTE(wsaDATA.wVersion)!=1||HIBYTE(wsaDATA.wVersion!=1))
	{
		WSACleanup();
		return;
	}

	//创建套接字
	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
	/************************************************************************
      函数原型 int socket(int domain, int type, int protocol);
      domain:  应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
	  type:    要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW;
	  protocol:指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,
	           此参数一般取值为0,系统会根据套接字的类型决定应使用的传输层协议。
	************************************************************************/


	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);

	/***********************************************************************
	此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
	但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构sockaddr_in.
	struct sockaddr {
				unsigned short sa_family; 
				char sa_data[14]; 
	};
	------------------------------------------------------------------------
	struct sockaddr_in {
					short sin_family;          //Address family ,地址家族,一般都是“AF_xxx”的形式。
					                             通常大多用的是都是AF_INET,代表TCP/IP协议族.
					unsigned short sin_port;   //Port number,存储端口号(使用网络字节顺序).
					struct in_addr sin_addr;   //Internet address ,存储IP地址,使用in_addr这个数据结构.
					unsigned char sin_zero[8]; //Same size as struct sockaddr ,sin_zero是为了让sockaddr与sockaddr_in
					                             两个数据结构保持大小相同而保留的空字节。
	}
	-------------------------------------------------------------------------
	
	*************************************************************************/


	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	/*
	connect()用来将参数 sockfd 的socket连至参数serv_addr 指定的网络地址.
	int connect(
				SOCKET s,                       //Descriptor identifying an unconnected socket.
				const struct sockaddr FAR* name,//Name of the socket to which the connection should be established.
				int namelen                     //Length of the name.
    );
	*/

	char recvBuf[100];

	recv(sockClient,recvBuf,100,0);
	/*
	int recv(SOCKET s,char FAR *buf, int len, int flags  ); 
	第一个参数指定接收端套接字描述符;
	第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
	第三个参数指明buf的长度;
	第四个参数一般置0.
	*/
	printf("%s\n",recvBuf);

	send(sockClient,"这是张三",strlen("这是张三")+1,0);
	/*
	int send( SOCKET s,const char FAR *buf,int len,int flags); 
	第一个参数指定发送端套接字描述符;
    第二个参数指明一个存放应用程序要发送数据的缓冲区;
    第三个参数指明实际要发送的数据的字节数;
	第四个参数一般置0.
	*/

	closesocket(sockClient);
	WSACleanup();
		



}


#include <Winsock2.h>
#include <stdio.h>
void main()
{
	//加载socket库 
	WORD wVersionRequested;
	WSAData wsaDATA;
	int err;

	wVersionRequested = MAKEWORD(1,1);

	err = WSAStartup(wVersionRequested,&wsaDATA);
	if (err!=0)
	{
		return;
	}

	if (LOBYTE(wsaDATA.wVersion)!=1||HIBYTE(wsaDATA.wVersion!=1))
	{
		WSACleanup();
		return;
	}
	//创建套接字
	SOCKET sockSvr=socket(AF_INET,SOCK_STREAM,0);

	SOCKADDR_IN addrSvr;
	addrSvr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	addrSvr.sin_family=AF_INET;
	addrSvr.sin_port=htons(6000);

	bind(sockSvr,(SOCKADDR*)&addrSvr,sizeof(SOCKADDR));
	/*
	int bind(int socket, const struct sockaddr *address,socklen_t address_len);
	bind函数用于将套接字绑定到一个已知的地址上.
	socket:是一个套接字.
	address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号.
	address_len:确定address缓冲区的长度.
    返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR.
	*/


	listen(sockSvr,5);
	/*************************************************************************************
	int listen(int sockfd, int backlog);
	功能:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,
	从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的
	套接字变为被动连接.
     listen函数在一般在调用bind之后-调用accept之前调用.
	 sockfd : 一个已绑定未被连接的套接字描述符;
	 backlog: 连接请求队列(queue of pending connections).
	          的最大长度(一般由2到4).用SOMAXCONN则由系统确定.
	**************************************************************************************/

	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);

	while (1)
	{
		SOCKET sockConn=accept(sockSvr,(SOCKADDR*)&addrClient,&len);
		char sendBuf[100];
		sprintf(sendBuf,"今天天气好晴朗!",inet_ntoa(addrClient.sin_addr));
		
		send(sockConn,sendBuf,strlen(sendBuf)+1,0);
		char recvBuf[100];
		recv(sockConn,recvBuf,100,0);
		printf("%s\n",recvBuf);
		closesocket(sockConn);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值