简单socket聊天小程序+socket简单封装

本文介绍了如何创建一个简单的单线程socket聊天程序,涵盖了客户端和服务端的实现。同时,讲解了Windows环境下socket的简单封装,并讨论了IP地址在网络字节序和主机字节序之间的转换。此外,还提到了TCP流量限制和UDP套接字的注意事项,以及跨平台的UDP通信代码和C++库汇总。
摘要由CSDN通过智能技术生成

本博客内容:
一、单线程简单socket聊天小程序
二、windows socket套接字简单封装
三、IP地址的表示形式与各个转换函数
#一、单线程简单socket聊天小程序
###客户端

#include<WinSock2.h>
#include<stdio.h>

//定义程序中使用的常量
#define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址
#define PORT    5150    //服务器端的端口号
#define MSGSIZE 1024  //收发缓冲区的大小

//库文件
#pragma comment(lib,"ws2_32.lib")

int main()
{
//1.初始化
	//该结构体包含系统所支持的winsock版本信息
	WSADATA wsaData; 
	//初始化Winsock2.2
	if(WSAStartup(0x0202,&wsaData)!=0)  //WSAStartup(MAKWWORD(2,2),&wsaData)
	{
		printf("无法初始化!"); return 0;
	}
//2.socket套接字
	//定义客户端连接所用的套接字
	SOCKET sClient;  
	//参数1:TCP/IP协议族,参数2:TCP协议,UDP使用SOCK_DGRAM 
	sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

	if(sClient==INVALID_SOCKET)
	{
			printf("socket failed");
			return 0;
	}
//3.远端服务器
	//保存远端服务器地址
	SOCKADDR_IN server; 
	//置0操作
	memset(&server,0,sizeof(SOCKADDR_IN));
	//指定远端服务器的3个参数
	server.sin_family=AF_INET; //指定地址家族
	server.sin_port=htons(PORT);//指定端口号
	server.sin_addr.s_addr=inet_addr(SERVER_ADDRESS);//server.sin_addr.s_addr=htonl(SERVER_ADDRESS)
			//sin_addr字段用于保存IP地址,sin_addr字段也是一个结构体,sin_addr.s_addr用于保存最终的IP地址
	        //inet_addr()函数用于将形如"127.0.0.1"字符串转换为IP地址格式

//4.连接到服务器
	connect(sClient,(struct sockaddr *)&server,sizeof(SOCKADDR_IN)); 

//5.建立连接后传输数据
	char  szMessage[MSGSIZE]; //收发缓冲区
	int ret; //成功接收到的字节数
	while(TRUE)
	{
		printf("Send:");
		//从键盘输入
		gets(szMessage);
		//发送数据
		//指明发送数据的套接字,待发送数据的保存地址,指明数据长度
		send(sClient,szMessage,strlen(szMessage),0);

		//接收数据
		ret=recv(sClient,szMessage,MSGSIZE,0);
		szMessage[ret]='\0'; //添加这个截断字符

		printf("Received [%d bytes ]: '%s'\n",ret,szMessage);

	}
//6.释放资源和结束工作
	closesocket(sClient);
	WSACleanup();
	return 0;
}

###服务端

#include<WinSock2.h>
#include<stdio.h>

#define PORT 5150
#define MSGSIZE 1024

#pragma comment(lib,"ws2_32.lib")

int main()
{
//1.初始化
	WSADATA     wsaData;
	WSAStartup(0x0202,&wsaData);

//2.创建服务端+客户端套接字  地址
	SOCKET sListen;
	sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	SOCKET sClient; //无需初始化

//3. 服务端自身地址的设置
	SOCKADDR_IN local;
	SOCKADDR_IN client;  //客户端的地址 此处无需处理
	local.sin_family=AF_INET;
	local.sin_port=htons(PORT);
	local.sin_addr.s_addr=htonl(INADDR_ANY);

//4.定义一个客户端地址+绑定操作

	bind(sListen,(struct sockaddr * ) &local ,sizeof(SOCKADDR_IN));

//5.将socket设置为监听模式
	listen(sListen,1);   //参数2表示可以监听的个数

//6.接收客户端发送的连接请求
	int iaddrSize=sizeof(SOCKADDR_IN);
	sClient=accept(sListen,(struct sockaddr *)&client,&iaddrSize);  //注意此处最后一个参数是地址,而不是长度和bind函数不同

	//打印客户端的部分信息
	 printf("Accep
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值