Windows下的socket通信,采用tcp协议,简单的报文交互,c语言。

  • Post author:
  • Post category:其他


本文将套接字的初始化,套接字的关闭,以及创建套接字单独封装为函数,精简了main函数。以下为函数代码详解。

server服务器端

1.初始化网络库

bool init_Socket()//初始化网络库
{
	WSADATA wsadata;
	if(0!=WSAStartup(MAKEWORD(2,2),&wsadata ))//windows异步套接字启动
	{
		printf("[error]WSAStarup failed,code %d\n", WSAGetLastError());
		return false;
	}
	return true;
}

2.关闭网络库

bool close_Socket()//关闭网络库
{
	if (0!=WSACleanup())
	{
		printf("[error]WSACleanup failed,code %d", WSAGetLastError());
		return false;
	}
	return true;	
}

3.创建套接字

SOCKET create_serverSocket()
{
	SOCKET fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建一个空的socket
	if (INVALID_SOCKET == fd)
	{
		printf("[error]socket failed,code %d", WSAGetLastError());
		return INVALID_SOCKET;
	}
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);//把本地字节序转换为网络字节序
	addr.sin_addr.S_un.S_addr = ADDR_ANY;//绑定本地任意IP

	if (SOCKET_ERROR == bind(fd,(struct sockaddr *)&addr, sizeof(addr)))
	{
		printf("[error]bind failed,code %d", WSAGetLastError());
		return INVALID_SOCKET;//-1
	}
	listen(fd, 10);

	return fd;
}

4.main函数

int main()
{
 	 char recvBu[1024] = "今天周几?";
	 init_Socket();
	 SOCKET serfd = create_serverSocket();
	 printf("server create successed,wait client connet....\n ");//
	 SOCKET clifd = accept(serfd, NULL, NULL);
	 if (clifd==INVALID_SOCKET)
	 {
		 printf("[error]accept failed,code %d", WSAGetLastError());
	 }
	 //printf("您好,请问有什么问题\n");

	 if (SOCKET_ERROR== send(clifd, recvBu, strlen(recvBu), 0))
	 {
		 printf("[error]hgello send failed,code %d", WSAGetLastError());
	 }

	 char recvBuf[1024] = "";
	 int ret = recv(clifd, recvBuf, 1024, 0);
	 if (ret == 0)
	 {
		 printf("客户端正常下线下线\n");
	 }
	 else if (ret < 0)
	 {
		 err("recv");
	 }
	 puts(recvBuf);

	 closesocket(clifd);
	 closesocket(serfd);
	 close_Socket();

	 getchar();
	 return 0;
}

至此,server代码主要模块撰写完毕,头文件与完整代码将在文末给出。

cilent客户端

1.初始化网络库

bool init_Socket()//初始化网络库
{
	WSADATA wsadata;
	if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))//windows异步套接字启动
{
		printf("[error]WSAStarup failed,code %d\n", WSAGetLastError());
		return false;
	}
	return true;
}

2.创建套接字

此函数调用的时候需要自己输入本机ip地址。

SOCKET create_clientSocket(const char* ip)
{
	SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建一个空的socket
	if (INVALID_SOCKET == fd)
	{
		err("socket");
		return INVALID_SOCKET;
	}
	//给socket绑定服务端的ip地址和端口号
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);//把本地字节序转换为网络字节序
	addr.sin_addr.S_un.S_addr = inet_addr(ip);//绑定服务器任意IP
	if (INVALID_SOCKET == connect(fd, (struct sockaddr*)&addr, sizeof(addr)))
	{
		err("connec");
		return INVALID_SOCKET;
	}

	return fd;
}

3.main函数

int main()
{
	init_Socket();

	SOCKET fd = create_clientSocket("127.0.0.1");

	char recvBuf[1024] = "";
	int ret = recv(fd, recvBuf, 1024, 0);
	if (ret == 0)
	{
		printf("下线\n");
	}
	else if(ret<0)
	{
		err("recv");
	}
	puts(recvBuf);
	char sendBuf[1024] = "今天周五";
	send(fd, sendBuf, strlen(sendBuf), 0);

	closesocket(fd);
	getchar();	
	return 0;
}

至此,cilent客户端主要模块撰写完毕,让我们来看看运行结果。

完整代码如下:

Windows下的socket通信,采用tcp协议,简单的报文交互,c语言。-C文档类资源-CSDN下载



版权声明:本文为qq_44711805原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。