Linux篇
1.除了常规的头文件外,socket编程专门使用的头文件包括:<sys/socket.h>[申明socket编程中使用的各种api,如socket(),bind()等],<netinet/in.h>[包含htons()等],<arpa/inet.h>[包含inet_addr(),inet_ntoa()等]。如图所示
2.socket中使用struct sockaddr_in数据结构配置协议族、端口和IP(sin_family,sin_port,sin_addr.s_addr)三个应用程序最为关心的内容。同时在传参进入API函数的时候使用struct sockaddr转化。
3.TCP/IP使用AF_INET地址簇。
4.由于在网络上传输数据需要遵循网络字节序,因此使用htons(),htonl(),ntohs(),ntohl(),这几个函数进行本地字节序和网络字节序的转化.
5.IP地址由字符串转化为sin_addr.s_addr接受的格式使用inet_addr(),而将sin_addr转化为字符串使用inet_ntoa().
6.本地IP可使用INADDR_ANY宏表示.
7.面向连接的socket编程使用TCP协议,相对的编程使用的宏是SOCK_STREAM,流程如下.
8.服务器端监听队列不能设置太小,最好大于等于10.(系统默认为20,若设置过小客户端连接时就会出现”connect refused”);
9. 面向无连接的socket编程使用UDP协议,相对的编程使用的宏是SOCK_DGRAM,流程如下.
Windows篇
1.windows下也可以采用socket进行网络编程,不过稍有不同。不同之处如下;
2.使用的头文件为<winsock2.h>,需在该工程的setting->link页面下的库模块处添加” ws2_32.lib”;
3. typedef UINT SOCKET;
4.程序初始化时要添加以下代码对winsocket进行初始化:
5.关闭套接字使用closesocket().之后还要使用WSACleanup()进行winsocket关闭工作;
PS:一些额外收获----------windows下换行符为“/r/n”unix和linux下为“/n”而mac下为“/r”;对于mfc中新建的cpp文件可以不使用预编译头文件pch,方法是在该文件上右键选择setting,在“C/C++”页面下拉框中选择预编译头文件,设置为不需要预编译头文件。
以下附上练习代码:
服务器端:
客户端: