600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 网络编程(3)—— 基于Windows系统的socket服务器端的编程步骤

网络编程(3)—— 基于Windows系统的socket服务器端的编程步骤

时间:2022-03-16 08:36:43

相关推荐

网络编程(3)—— 基于Windows系统的socket服务器端的编程步骤

socket服务器端编程的基本步骤:

1.1 准备Windows服务器端开发环境

导入ws2_32.lib静态连接库,项目属性->配置属性->链接器->输入->附加依赖项中添加ws2_32.lib。

1.2 设置Winsock版本并初始化相应版本的库

int WSAStartup(WORD wVersionRequsted,LPWSADATA lpWSAData);

wVersionRequested--要用的Winsocket版本,通常填入MAKEWORD,如MAKEWORD(2,2),表示主版本号是2,副版本号也是2

lpWSAData--WSADATA结构体变量的地址,调用完函数后,相应的参数将填充已经初始化的库信息,无特殊含义。

1.3 创建socket

SOCKET socket(int af,int type,int protocol);

af--通信协议族,常用的AF_INET,AF_INET6等

type--通信类型,SOCK_STREAM面向连接的可靠的传输方式;SOCK_DGRAM面向消息的非可靠的传输方式。

protocol--协议类型,通常为0

返回值--成功返回创建的SOCKET句柄,失败返回INVALID_SOCKET

1.4 绑定地址信息

int bind(SOCKET s,const struct sockaddr* addr,int namelen);

s--SOCKET句柄

addr--存放服务器通信地址信息的结构体信息

namelen--上述结构体变量的长度

返回值--成功返回0,失败返回SOCKET_ERROR

1.5 开启监听

int listen(SOCKET s,int backlog);

s--服务器端的SOCKET句柄

backlog--可容纳连接队列的最大成员数

返回值--成功返回0,失败返回SOCKET_ERROR

1.6 接收客户端连接

SOCKET accept(SOCKET s,struct sockaddr* addr,int* addrlen);

该函数为阻塞函数,成功接收到客户端的连接后,解除阻塞

s--服务器SOCKET句柄

addr--用来保存客户端地址信息的结构体

addrlen--保存客户端地址信息的结构体变量的大小

返回值--成功返回代表客户端的SOCKET句柄,失败返回INVALID_SOCKET

1.7 发送数据

int send(SOCKET s,const char* buf,int len,int flags);

s--客户端的SOCKET句柄

buf--发送的buffer

len--上述buffer的长度

flags--传输数据时用到的多种选项信息

返回值--成功返回实际传送的字节数,失败返回SOCKET_ERROR

1.8 关闭SOCKET

int closesocket(SOCKET s);

s-SOCKET句柄

返回值--成功返回0,失败返回socket_ERROR

1.9 注销Winsock相关库

int WSACleanup();

返回值--成功返回0,失败返回SOCKET_ERROR

示例代码:#include <winsock2.h>#include <stdio.h>#include "stdlib.h"void error_handling(char* message);int main(int argc,char* argv[]){WSADATA wsaData;SOCKET hSeverSock,hClntSock;SOCKADDR_IN servAddr,clntAddr;int szClntAddr;char Message[]="Hello World";if(argc!=2){printf("Usage : %s <port>\n",argv[0]);exit(1);}if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)error_handling("WSAStartup error");hSeverSock=socket(PF_INET,SOCK_STREAM,0);if(hSeverSock==INVALID_SOCKET)error_handling("socket error");memset(&servAddr,0,sizeof(servAddr));servAddr.sin_family=AF_INET;servAddr.sin_addr.s_addr=htonl(INADDR_ANY);servAddr.sin_port=htons(atoi(argv[1]));if(bind(hSeverSock,(SOCKADDR*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)error_handling("bind error");if(listen(hSeverSock,5)==SOCKET_ERROR)error_handling("listen error");szClntAddr=sizeof(clntAddr);hClntSock=accept(hSeverSock,(SOCKADDR*)&clntAddr,&szClntAddr);if(hClntSock==INVALID_SOCKET)error_handling("accept error");send(hClntSock,Message,sizeof(Message),0);closesocket(hClntSock);closesocket(hSeverSock);if(WSACleanup()!=0)error_handling("WSACleanup error");getchar();return 0;}void error_handling(char* message){fputs(message,stderr);fputc('\n',stderr);exit(1);}

Github位置:

/HymanLiuTS/NetDevelopment

克隆本项目:

gitclone git@:HymanLiuTS/NetDevelopment.git

获取本文源代码:

git checkout NL03

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。