Windows系统下的socket编程
1、winsock2.h,windows系统下使用socket只需要一个头文件
2、编译时需要添加ws2_32.lib库,设置->搜索code-runner.executorMap,打开setting.json文件,把C的编译参数修改为:
"code-runner.executorMap": {
"c": "cd $dir && gcc $fileName -std=gnu99 -lws2_32 -lpthread -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
}
3、初始化网络库:
int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);
功能:初始化网络库
wVersionRequested:指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本。
MAKEWORD(主版本号、副版本号),一般使用2,2即可。
lpWSAData:返回请求的版本信息
返回值:成功返回0,失败返回错误信息
4、使用标准socket收发数据接口
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:接收数据
sockfd:socket对象描述符
buf:缓冲区首地址
len:缓冲区大小
flags:是否阻塞,一般写0即可
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送数据
socket:socket对象描述符
buf:缓冲区首地址
len:缓冲区大小
flags:是否阻塞,一般写0即可
int closesocket(int socket);
功能:关闭socket对象
如何优雅地使用socket
由于大小端的原因,在使用socket通信时,不能直接发送变量,而是要发送字符串,因此要先把要发送的数据转换成字符串在再发送。
int sprintf(char *str, const char *format, ...);
功能:把各种类型的变量输出到字符长中
int sscanf(const char *str, const char *format, ...);
功能:从字符串中读取各种类型的数据到变量中
把socket对象转换成FILE对象,使用fprintf/fscanf进行读写数据
FILE *fdopen(int fd, const char *mode);
功能:把socket描述符转换成FILE对象
按流关闭socket
int shutdown(int sockfd, int how);
功能:关闭socket的读写流
sockfd:要关闭的socket对象
how:
SHUT_RD 关闭读功能
SHUT_WR 关闭写功能
SHUT_RDWR 关读写功能