【socket】有关socket的编程<一>

有关TCP方式的socket网络通信的编程

以下代码都能编译通过
1. 客户端代码

#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void main()
{
	WORD wVersionRequest;
	WSADATA wsadata;
	int err;

	wVersionRequest=MAKEWORD(1,1);

	err=WSAStartup(wVersionRequest,&wsadata);

	if(err!=0)
	{
		return;
	}

	if(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1)
	{
		WSACleanup();
		return;
	}

	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,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);

//客户端不需要绑定,可以直接连接服务器端 connect与服务器建立一个连接
//设定服务器端的IP地址和端口
	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

	char recvBuf[100];
	recv(sockClient,recvBuf,100,0);
	printf("client:%s\n",recvBuf);

	send(sockClient,"This is kisi",strlen("This is kisi")+1,0);

	closesocket(sockClient);
	WSACleanup();
	//cout<<"hello world!"<<endl;
}

2.服务端代码

#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
//TCP里的过程比较复杂 而UDP里的内容相对来说简化了很多
void main()
{
	WORD wVersionRequest;
	WSADATA wsadata;
	int err;

	WORD wVersionRequested;
	wVersionRequested=MAKEWORD(2,2);          //0000 0010 0000 0010 = 512+2=514 输出 
	cout << wVersionRequested << endl;
	wVersionRequested=MAKEWORD(2,1);         //0000 0001 0000 0010  =256+2=258  1在高八位
	cout << wVersionRequested << endl;
//WORD MAKEWORD(BYTE bLow, //指定新变量的低字节序;BYTE bHigh //指定新变量的高字节序;);
	//高位字节指出副版本(修正)号,低位字节指明主版本号.

	wVersionRequest=MAKEWORD(1,1); //MAKEWORD(1,1)和MAKEWORD(2,2)的区别在于,前者只能一次接收一次,不能马上发送,而后者能。

//加载套接字
	err=WSAStartup(wVersionRequest,&wsadata);
					//版本号
	if(err!=0)
		return;

	if(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1)  //取低八位和高八位
	{
		WSACleanup(); //释放为该应用程式分配的资源
		return;
	}
	                //#define AF_INET         2               // internetwork: UDP, TCP, etc.
					//#define SOCK_STREAM     1               /* stream socket */
					//#define SOCK_DGRAM      2               /* datagram socket */
	SOCKET sockSrc=socket(AF_INET,SOCK_STREAM,0);  //第三个参数是protpcol 推荐使用0
//typedef UINT_PTR        SOCKET;  其实就是int型

	printf("Socket : %d\n",sockSrc);  //548  ?


	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  //套接字的主机IP  本函数将一个32位数从主机字节顺序转换成网络字节顺序
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);					//本函数将一个16位数从主机字节顺序转换成网络字节顺序。 只是端口号

//#define s_addr  S_un.S_addr /* can be used for most tcp & ip code */
//#define INADDR_ANY              (ULONG)0x00000000

//绑定               套接字的本地地址信息     地址结构的长度
	// ADDRESS_FAMILY sa_family;           // Address family.
	bind(sockSrc,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));         //绑定创建的套接字  要绑定的IP地址信息  地址信息 的长度

//监听模式
	listen(sockSrc,5);  //第二个参数是等待连续队列的最大长度

	SOCKADDR_IN addrClient; //实际接收的实体地址
	int len=sizeof(SOCKADDR);

	while (1)
	{
//接收客户端发来的请求 accepet
		                               //指向一个缓冲区的指针,该缓冲区用来接收连接实体的地址,也就是保存客户端IP的地址信息和端口信息
		SOCKET sockConn=accept(sockSrc,(SOCKADDR*)&addrClient,&len); //返回地址信息的长度
//    _Out_writes_bytes_opt_(*addrlen) struct sockaddr FAR * addr,
//   _Inout_opt_ int FAR * addrlen

//有out说明都是传出来的特征 属性 变量  * 指定了以指针地址的方式传出来!!!【类似toolkit中的API】
		char sendBuf[100];
		sprintf(sendBuf,"Welcome %s to ....",inet_ntoa(addrClient.sin_addr)); // inet_ntoa将一个IP转换成一个互联网标准点分格式的字符串
		                                        //第二个传出来的参数addrClient 带了很多地址方面的详细信息 可以打出来 使用特定的函数 inet_ntoa
//send通过已经建立连接的套接字发送数据
		send(sockConn,sendBuf,strlen(sendBuf)+1,0);
		    //已经建立连接的套接字  第二个参数是指要传递的数据 和客户端连接 客户端也有一个自己的套接字

		char recvBuf[100];

//recv 从一个已经连接的套接字接收数据
		recv(sockConn,recvBuf,100,0);
		             //第二个参数是用来保存数据缓冲区
		printf("%s\n",recvBuf);
		closesocket(sockConn);
	}

//connect
//recvform
//sendto
//htons htonl
}

效果图:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值