socket中tcp 和 udp的基本用法
2008-09-25 16:59
513 查看
socket编程(udp tcp)代码备忘 C++/C sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW); 基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM). 1.TCP流式套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK! 服务器端程序: 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 ( err != 0 ) { return; }//加载套接字库,加裁失败则返回 if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( 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*)&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的第三个参数一定要有初始值。 //等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。 //此时程序在此发生阻塞 char sendBuf[100]; sprintf(sendBuf,"Welcome %s to http://www.sunxin.org", inet_ntoa(addrClient.sin_addr)); //用返回的套接字和客户端进行通信(send/recv)。 send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100]; recv(sockConn,recvBuf,100,0); printf("%s/n",recvBuf); closesocket(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);创建套接字(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 recvBuf[100];和服务器端进行通信(send/recv)。 recv(sockClient,recvBuf,100,0); printf("%s/n",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、关闭套接字。 服务器端代码: #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 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_IN addrClient; int len=sizeof(SOCKADDR); char recvBuf[100]; recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); printf("%s/n",recvBuf); closesocket(sockSrv); WSACleanup(); } 客户端代码: #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_DGRAM,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); sendto(sockClient,"Hello",strlen("Hello")+1,0, (SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); closesocket(sockClient); WSACleanup(); } ===========下面是字符界面下的一个简单UDP聊天程序===== 服务器端:============================== #include <stdio.h> #include <WINSOCK2.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 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(6101); bind(sockSrv,(sockaddr*)&addrSrv,sizeof(sockaddr)); char sendBuf[100]; char recvBuf[100]; char tempBuf[100]; int len=sizeof(sockaddr); SOCKADDR_IN addrClient; while(1) { recvfrom(sockSrv,tempBuf,strlen(tempBuf),0,(sockaddr*)&addrClient,&len); if('q'!=tempBuf[0]) { sprintf(recvBuf,"%s say: %s",inet_ntoa(addrClient.sin_addr),tempBuf); printf("%s/n",recvBuf); printf("please input your data: "); gets(sendBuf); sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(sockaddr*)&addrClient,len); } else { printf("%s request to quit the chat platform./n", inet_ntoa(addrClient.sin_addr)); sendto(sockSrv,"q",strlen("q")+1,0,(sockaddr*)&addrClient,len); break; } } closesocket(sockSrv); WSACleanup(); } 客户端:=============================== #include <stdio.h> #include <WINSOCK2.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_DGRAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //htonl htons inet_addr inet_ntoa addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6101); char sendBuf[100]; char tempBuf[100]; char recvBuf[100]; int len=sizeof(sockaddr); while(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'!=tempBuf[0]) { sprintf(recvBuf,"%s say: %s",inet_ntoa(addrSrv.sin_addr),tempBuf); printf("%s/n",recvBuf); } else { printf("the server has been closed!/n"); sendto(sockClient,"q",strlen("q")+1,0,(sockaddr*)&addrSrv,len); break; } } closesocket(sockClient); WSACleanup(); 此信息来自〖软工吧论坛http://www.gcs8.cn〗 查看原网址:http://www.gcs8.cn/htm_data/41/0804/12984.html |
相关文章推荐
- Socket,TCP,UDP,HTTP基本通信原理和OC版本Demo
- golang中net包用法(三)--TCP和UDP以及Unix domain socket
- 基本的TCP/IP Socket用法(一)
- JAVA基础学习(二十四)--Socket基础一UDP与TCP的基本使用
- 黑马程序员--10.网络编程--02.【网络传输三要素在Java中的体现】【TCP和UDP概念】【Socket基本概念】
- 基本的TCP/IP Socket用法(二)
- TCP网络编程流程及Socket API基本用法
- JAVA基础学习day24--Socket基础一UDP与TCP的基本使用
- 基本的TCP/IP Socket用法(一)
- 基本的TCP/IP Socket用法(二)
- linux下C/C++网络编程基本:socket实现tcp和udp的例子
- ACE 基本的 TCP/IP Socket 用法
- HTTP、TCP、UDP、Socket基本概念
- 网络:基本概念之HTTP、TCP/IP、UDP,Socket
- socket UDP TCP 的一些用法
- Linux Socket TCP通信基本用法
- ACE学习笔记一(基本的TCP/IP Socket用法)
- socket.io的基本用法
- 基于 TCP (面向连接)和无连接UDP协议的 socket 套接字编程
- nginx代理socket tcp/udp