C 语言Windows socket编程笔记
最近学习了如何在Windows平台下使用c语言进行socket编程,理了下思绪,笔记如下。
语言标准:c99
编译器 :gcc
Part1:TCP
1.使用socket通信过程
建立socket。
将socket绑定到一本地地址。
服务端:
- 监听是否有连接请求
- 接受一个连接请求同时保存客户端信息(建立连接)
- 接受客户端数据 或 向客户端发送发送数据(单次或重复此过程)
- 关闭客户端连接(可选)
客户端:
- 获取服务器地址
- 向服务器发起建立连接请求(程序停下直到连接成功或失败)
- 向服务器发送数据或接受服务器发来的数据(单次或重复此过程)
- 关闭同服务器的连接(可选)
如果是在Windows平台下,先初始化socket环境。
2.函数说明
ps:所需头文件 #include <winsock2.h>
服务端
<1> socket环境初始化
WSADATA wsaData;//1.启动SOCKET库,版本为2.2 int errcode = WSAStartup(MAKEWORD(2,2),&wsaData); if(errcode != 0) { puts("Wsastartup error"); return 0; } if (LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )//检查Socket库的版本是否为2.2 { WSACleanup(); puts("Version error"); return 0; }
WSAStartup说明<2> 创建socket
sock_ser = socket(PF_INET,SOCK_STREAM,0); if(sock_ser == INVALID_SOCKET) { puts("sock_ser error"); return 0; }
百科解释:
socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。如果协议protocol未指定(等于0),则使用缺省的连接方式。
int socket( int af, int type, int protocol);af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。type:指定socket类型。新套接口的类型描述类型,如TCP(SOCK_STREAM)和UDP(SOCK_DGRAM)。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。protocol:顾名思义,就是指定协议。 套接口所用的协议。如调用者不想指定,可用0。常用的协议有,IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。注:PF_INET 与 AF_INET 值相同,但所代表含义不同。socket变量所存储的数据就是一个int类型的值。标志着这个socket的 “号码” ,这个号码是由操作系统负责分配的。
<3> 设置服务端本地ip并绑定
SOCKADDR_IN 结构说明(来自百度)
struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; typedef struct sockaddr_in SOCKADDR_IN; typedef struct in_addr { union{ struct { unsigned char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { unsigned short s_w1,s_w2; } S_un_w; unsigned long S_addr; }S_un; }in_addr;
sin_family指代协议族