网络编程 SOCKETS (套接字)编程有三种,流式套接(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW); 基于TCP的SOCKET编程是采用流式套接字(SOCK_STREAM).基于UDP采用的数据报套接字 1.TCP流式套接字的编程步骤在使用之前须链接库函数:工程>设置>LINK>输入WS2_32.LIB, 服务端程序: 1,加载套接字库 2.创建套接字(SOCKET) 3,将套接字绑定到一个本地地址和端口上(BIND) 4,将套接字设为监听模式,准备接收客户端请求(LISTEN) 5.等待客户请求到来,当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(ACCEPT) 6,用返回的套接字和客户端进行通信(SEND/RECV) 7.返回,等待另一客户请求. 8.关闭套接字. 客户端程序.: 1,加载套接字库 2.创建套接字(SOCKET) 3,向服务器发出连接请求(CONNECT) 4,和服务器端进行通信(SEND/RECV) 5,关闭套接字 服务端代码如下: #include<Winsock2.h> //加载头文件 #include<stdio.h> //加载标准输入输出头文件 void main() { WORD wVersionRequested;// WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); //1.1版本的套接字 err = WSAStartup(wVersionRequested,&wsaData); if(LOBYTE(wsaData.wVersion) = 1 || HIBYTE(wsaData.wVersion) = 1) { ...WSACleanup(); ...return; }//如果不是1.1的则退出 SOCKET sockSrv = socket (AF_INET,SOCK_STREAM,0);//创建套接字 SOCKADDRIN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式 addrSrv.sin_family = AF_INET; addrSrv.sin_post = htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将套接字绑定到一个本地地址和端口上 listen(sockSrv,5);//将套接字设为监听模式,准备接收客户请求 SOCKADDR_IN addrClient;//定义地址族 int len = sizeof(SOCKADDR);//初始化这个参数,这个参数必须被初始化 while(1) { SOCKET sockConn = accept(sockSrv,(SOCKADR*)&addrClient,&len);//accept的第三个参数一定要有初始值.//等待客户请求到来当请求到来后,接受连接请求,返回一个亲的对应于此连接的套接字 //止时程序在此发生阻塞 char sendBuf[100]; sprintf(sendBuf,"Welcome%s to ",inet_ntoa(addrClient.sin_addr));//用返回的套接字和客户端进行通信 send (sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100]; recv(sockConn,recvBuf,100,0); printf("%s/n",recvBuf); cloasesocket(sockConn);//关闭套接字.等待另一个用户请求 } } 客户端代码如下: #include<Winsock2.h> #include<stdio.h> void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); err = WSASTartup(wVersionRequested,&wsaData);//加载套接字库 if(err!=0) { return; } if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1 ) { WSACleanup(); return; } SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);//创建套接字 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服务器发出连接请求 char recvBuf[100];//和服务器端进行通信 recv(sockClient,recvBuf,100,0); printf("%s/n",recvBuf); send(sockClient,"This is lisi ",strlen("This is lisi ")+1,0); closesocket(sockClient);//关闭套接字 WSACleanup();//心须调用这个函数清除参数 |
网络编程
最新推荐文章于 2021-08-19 14:19:43 发布