本博客内容:
一、单线程简单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