1、socket编程socket编程(udp tcp)代码备忘 C+/C socket编程(udp tcp)代码备忘 C+/Csockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM).1.TCP流式套接字的编程步骤在使用之前须链接库函数:工程-设置-Link-输入ws2_32.lib,OK!服务器端程序:1、加载套接字库2、创建套接字(socket)。 3、将套接字绑定到一个本地地址和端
2、口上(bind)。4、将套接字设为监听模式,准备接收客户请求(listen)。5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。6、用返回的套接字和客户端进行通信(send/recv)。7、返回,等待另一客户请求。8、关闭套接字。客户端程序:1、加载套接字库2、创建套接字(socket)。 3、向服务器发出连接请求(connect)。4、和服务器端进行通信(send/recv)。5、关闭套接字。socket-bind-listen-accept-send/recvsocket-connect-send/recvUDP socket-bind-
3、recvfromsocket-sendto服务器端代码如下:#include /加裁头文件#include /加载标准输入输出头文件void main()WORD wVersionRequested;/版本号WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );/1.1版本的套接字err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) return;/加载套接字库,加裁失败则返回if ( LOBYTE( wsaData.wVersion ) != 1 |H
4、IBYTE( wsaData.wVersion ) != 1 ) WSACleanup( );return; /如果不是1.1的则退出SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);/创建套接字(socket)。SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/转换Unsigned short为网络字节序的格式addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)
5、&addrSrv,sizeof(SOCKADDR);/将套接字绑定到一个本地地址和端口上(bind)listen(sockSrv,5);/将套接字设为监听模式,准备接收客户请求(listen)。SOCKADDR_IN addrClient;/定义地址族int len=sizeof(SOCKADDR);/初始化这个参数,这个参数必须被初始化while(1)SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);accept的第三个参数一定要有初始值。/等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(
6、accept)。/此时程序在此发生阻塞char sendBuf100;sprintf(sendBuf,Welcome %s to http:/www.sunxin.org,inet_ntoa(addrClient.sin_addr);/用返回的套接字和客户端进行通信(send/recv)。send(sockConn,sendBuf,strlen(sendBuf)+1,0);char recvBuf100;recv(sockConn,recvBuf,100,0);printf(%sn,recvBuf);closesocket(sockConn);/关闭套接字。等待另一个用户请求客户端代码如下:#
7、include #include 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
8、=socket(AF_INET,SOCK_STREAM,0);创建套接字(socket)。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);向服务器发出连接请求(connect)。char recvBuf100;和服务器端进行通信(send/recv)。recv(sockClient,
9、recvBuf,100,0);printf(%sn,recvBuf);send(sockClient,This is lisi,strlen(This is lisi)+1,0);closesocket(sockClient);关闭套接字。WSACleanup();/必须调用这个函数清除参数2.UDP型套接字。服务器端(接收端)程序:1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。3、等待接收数据(recvfrom)。4、关闭套接字。客户端(发送端)程序:1、创建套接字(socket)。 2、向服务器发送数据(sendto)。3、关闭套接字。socket-
10、bind-recvfromsocket-sendtotcp socket-bind-listen-accept-send/recvsocket-connect-send/recv服务器端代码:#include #include void main()WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) return;if ( LOBYTE( wsaData
11、.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( );return; SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);SOCKADDR_
12、IN addrClient;int len=sizeof(SOCKADDR);char recvBuf100;recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);printf(%sn,recvBuf);closesocket(sockSrv);WSACleanup();客户端代码:#include #include void main()WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSASta
13、rtup( wVersionRequested, &wsaData );if ( err != 0 ) return;if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( );return; SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);addrSrv.sin_family=AF_INET;add
14、rSrv.sin_port=htons(6000);sendto(sockClient,Hello,strlen(Hello)+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);closesocket(sockClient);WSACleanup();=下面是字符界面下的一个简单UDP聊天程序=服务器端:=#include #include void main()WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup(
15、 wVersionRequested, &wsaData );if ( err != 0 )return;if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 )WSACleanup( );return; SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port
16、=htons(6101);bind(sockSrv,(sockaddr*)&addrSrv,sizeof(sockaddr);char sendBuf100;char recvBuf100;char tempBuf100;int len=sizeof(sockaddr);SOCKADDR_IN addrClient;while(1)recvfrom(sockSrv,tempBuf,strlen(tempBuf),0,(sockaddr*)&addrClient,&len);if(q!=tempBuf0)sprintf(recvBuf,%s say: %s,inet_ntoa(addrClien
17、t.sin_addr),tempBuf);printf(%sn,recvBuf);printf(please input your data: );gets(sendBuf);sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(sockaddr*)&addrClient,len);elseprintf(%s request to quit the chat platform.n,inet_ntoa(addrClient.sin_addr);sendto(sockSrv,q,strlen(q)+1,0,(sockaddr*)&addrClient,len);b
18、reak;closesocket(sockSrv);WSACleanup();客户端:=#include #include 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 )WS
19、ACleanup( );return; SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);/htonl htons inet_addr inet_ntoaaddrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6101);char sendBuf100;char tempBuf100;char recvBuf100;int len=sizeof(sockaddr);wh
20、ile(1)printf(please input your data: );gets(sendBuf);sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(sockaddr*)&addrSrv,len);recvfrom(sockClient,tempBuf,strlen(tempBuf),0,(sockaddr*)&addrSrv,&len);if(q!=tempBuf0)sprintf(recvBuf,%s say: %s,inet_ntoa(addrSrv.sin_addr),tempBuf);printf(%sn,recvBuf);elseprintf(the server has been closed!n);sendto(sockClient,q,strlen(q)+1,0,(sockaddr*)&addrSrv,len);break;closesocket(sockClient);WSACleanup();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1