Windows操作系统环境下的套接字编程主要步骤如下:
- 初始化WinSock的DLL动态链接库,使用WSAStartup函数。
- 创建套接字,进行地址、端口、协议等的绑定,涉及socket、bind函数。
- 进行套接字的监听、连接,涉及listen、accept、connect等函数。
- 进行数据包的收发通信,涉及send、recv函数。
- 关闭相应的套接字,涉及closesocket、shutdown函数。
- 注销和释放相应的动态链接库资源,使用WSAtarstup函数。
具体案例可参考如下:
- 案例一:查询主机名对应的IP地址
- 案例二:UDP实现的点对点聊天
- 案例三:UDP实现的点对点聊天(多线程)
- 案例四:TCP实现的点对点聊天
- 案例五:TCP实现的点对点聊天(多进程)
- 案例六:TCP实现的点对点聊天(多线程)
Windows 下的 socket 程序和 Linux 思路相同,但细节有所差别:
- Windows 下的 socket 程序依赖 Winsock.dll 或 ws2_32.dll,必须提前加载。
- Linux 使用"文件描述符"的概念,而 Windows 使用"文件句柄"的概念;Linux 不区分 socket 文件和普通文件,而 Windows 区分;Linux下socket()函数的返回值为 int类型,而 Windows 下为 SOCKET 类型,也就是句柄。
- Linux 下使用 read() / write() 函数读写,而 Windows 下使用 recv() / send() 函数发送和接收。
- 关闭 socket 时,Linux 使用 close() 函数,而 Windows 使用 closesocket() 函数。
接收发送函数区别:
read(sockfd, buff, buff_size);
write(sockfd, buff, buff_size);
recv(sockfd, buff, buff_size,MSG_WAITALL);
send(scokfd, buff, buff_size,MSG_WAITALL);
recv(sockfd, buff, buff_size,MSG_DONTWAIT);
send(scokfd, buff, buff_size,MSG_DONTWAIT);
recv(sockfd, buff, buff_size,0);
send(scokfd, buff, buff_size,0);
- 尽量使用recv(,MSG_WAITALL),read必须配合while使用,否则数据量大(240*384)时数据读不完。
- 编程时写入的数据必须尽快读出,否则后面的数据将无法继续写入。
- 最佳搭配如下:
nbytes = recv(sockfd, buff, buff_size,MSG_WAITALL);
nbytes = send(scokfd, buff, buff_size,MSG_WAITALL);
send(),recv(),sendto()和recvfrom()注意要点:
- send(),recv()用于TCP,sendto()及recvfrom()用于UDP。但是send(),recv()也可以用于UDP,sendto()及recvfrom()也可以用于TCP。
- sendto函数 和 recvfrom 函数一般用于UDP协议中,但是如果在 TCP 中 connect 函数调用后也可以用。
- sendto() 和recvfrom() --------> 利用数据报文方式进行数据传输。
|