C-socket编程,实现客户端与服务端通信(服务端)

2021-11-27 83 0

1.创建套接字socket();

2.地址,端口,监听设置。

3.接受连接请求accerpt();

4.发送数据send();

5.接受数据recv();

6.关闭closesocket();

#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")//去ws2_32.lib库查找
int main()
{
	WORD wVersionRequested;
	WSADATA wsaData;//用来接收windows socket的结构信息的
	int err;
	wVersionRequested = MAKEWORD(1,1);//使用1.1版本的socket库
	err=WSAStartup(wVersionRequested,&wsaData);
	if(err!=0)
	{
		printf("error");
		return -1;//返回值为零的时候表示成功申请了WSAStartup
	}
	if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
	{
		//检查低字节与高字节是不是确定是1,确定我们所请求的版本
		//否则,调用WSACleanup()清除信息,结束函数
		//	printf("error");
		WSACleanup();
		return -1;
	}
	//创建套接字,返socket操作,建立流式回套接字号sockSrv
	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
	//套接字socksrv与本地地址相连
	SOCKADDR_IN addrSrc;
	addrSrc.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	//将inaddr_any转换为网络字节序,调用htonl(long型)或htons(int型)
	addrSrc.sin_family=AF_INET;//地址族
	addrSrc.sin_port=htons(6000);//端口
	bind(sockSrv,(SOCKADDR*)&addrSrc,sizeof(SOCKADDR));
	//将套接字设置为监听模式,listen()通知tcp服务器准备好接收连接
	listen(sockSrv,10);
	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);
	//等待客户端的请求
	while(true)
	{
		//accept()接受连接,等待客户端连接
		// SOCKET accept(  SOCKET s,  struct sockaddr* addr,  int* addrlen);
		// 第一个参数,接收一个处于监听状态下的套接字
		// 第二个参数,sockaddr用于保存客户端地址的信息
		// 第三个参数,用于指定这个地址的长度
		// 返回的是向与这个监听状态下的套接字通信的套接字
		SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		//客户端与服务端进行通信
		// send(), 在套接字上发送数据
		// int send( SOCKET s,  const char* buf,  int len,  int flags);
		// 第一个参数,需要发送信息的套接字,
		// 第二个参数,包含了需要被传送的数据,
		// 第三个参数是buffer的数据长度,
		// 第四个参数,一些传送参数的设置
		// recv(), 在套接字上接收数据
		// int recv(  SOCKET s,  char* buf,  int len,  int flags);
		// 第一个参数,建立连接后的套接字,
		// 第二个参数,接收数据
		// 第三个参数,接收数据的长度,
		// 第四个参数,一些传送参数的设置
		char sendBuf[100];//缓冲
		printf(sendBuf,"welcome to the server program,let's start talking...\n",inet_ntoa(addrClient.sin_addr));
		send(sockConn,sendBuf,strlen(sendBuf)+1,0);
		char recvBuf[100];
		recv(sockConn,recvBuf,100,0);
		printf("%s\n",recvBuf);
		char * sockConnName="Client";
		printf("可以聊聊");
		int n=5;
		while(n--)
		{
			printf("还剩%d次:\n",n+1);
			char recvBuf[100];
            recv(sockConn, recvBuf, 100, 0);
            printf("%s Says: %s\n", sockConnName, recvBuf);
			char talk[100];
			printf("Please enter what you want to say next(\"quit\"to exit):");
			gets(talk);
			send(sockConn,talk,strlen(talk)+1,0);
			printf("\n");
		}
		printf("end");
		closesocket(sockConn);//关闭
	}
	printf("\n");
   // system("pause");
    return 0;
}

相关文章

【转】C++-ADO编程详解
c-各变量在内存中的位置
c-变态跳台阶
C++-编写类String的构造函数、析构函数和赋值函数
c-计蒜客 排序好的数组删除重复数字
c-归并排序

发布评论