socket编程服务器代码和客户端代码,socket服务器端的代码

  socket编程服务器代码和客户端代码,socket服务器端的代码

  三个。编程基础知识

  1.计算机网络

  2.国际电脑互联网地址

  3.协议

  4.网络体系结构

  5的体系结构和特点。传输控制协议

  6.客户机/服务器模式

  7的特点。传输控制协议

  8.插座的介绍

  9.连接/未连接套接字的系统调用序列图/流程图

  一个。程序运行效果图

  两个。程序源代码

  【cpp】查看plaincopyprint?

  //server . CPP # include iostream # include CST dio # include Winsock 2 . h usingnamespacetd;int(){//加载套接字动态链接库(dll)WORDwVersionRequested;WSADATAwsaData//此结构是用于接收WjndowsSocket的结构信息的interrwVersionRequested=MAKEWORD(1,1);//请求版本1.1 WinSock库ERR=WSA启动(Wversion requested,WSA data);如果(呃!=0){ return-1;//当返回值为零时,表示WSA启动成功申请} if (Lobyte (wsadata.wversion)!=1HIBYTE(wsaData.wVersion)!=1){//检查低位字节是否为1,高位字节是否为1,以确定是否是我们请求的1.1版本。//否则调用WSACleanup()清除信息,结束函数WSACleanup();return-1;}//创建套接字操作,建立流套接字,返回套接字socksrv//socket (intaf,inttype,int protocol);//第一个参数,指定地址簇(TCP/IP只能是AF_INET,或者写成PF_INET) //第二个参数,选择socket的类型(streaming socket),第三个参数,具体地址族相关协议(0是自动的)socketsocksrv=socket (AF _ inet,sock _ stream,0);//socket sockSrv连接到本地地址//intbind (sockets,conststructsockaddr * name,intnamelen);//第一个参数,指定要绑定的套接字;//第二个参数指定套接字的本地地址信息,地址结构会随着使用的网络协议而变化。//第三个参数指定网络协议地址的长度。//PS:structsockaddr { U _ Shortsa _ family;charsa _ data[14];};//sa_family指定地址族,sa_data起到占用内存分配区域的作用。//在TCP/IP中,sockaddr可以用sockaddr_in结构代替,方便填写地址信息。///structsockaddr _ in { short sin _ family;unsignedshortsin _ portstructin _ addrsin _ addrcharsin _ zero[8];};//sin_family表示地址族。对于IP地址,sin_family成员将始终是AF_INET。//sin_port指定将分配给套接字的端口。//sin_addr给出套接字的主机IP地址。//sin_zero[8]给出填充数,使sockaddr_in与sockaddr结构长度相同。//将IP地址指定为INADDR_ANY,允许套接字向分配给本地机器的任何IP地址发送或接收数据。//如果希望套接字只使用多个IP中的一个地址,可以指定实际地址并使用inet_addr()函数。

  SOCKADDR _ INaddrSrvaddrSrv.sin_addr。S_un。s _ addr=htonl(in addr _ ANY);//将INADDR_ANY转换为网络字节顺序,调用htonl(long)或htons(integer)addr SRV . sin _ family=AF _ INET;addr SRV . sin _ port=htons(6000);bind(sockSrv,(SOCKADDR*) addrSrv,sizeof(SOCKADDR));//第二个参数是强制类型转换。//将套接字设置为监听模式(连接请求),listen()通知TCP服务器准备接收连接。//intlisten(SOCKETs,int backlog);//第一个参数指定需要设置的套接字,第二个参数是(等待连接队列的最大长度)listen(sockSrv,10);//accept(),接收连接并等待客户端连接//socket accept (sockets,struct sockaddr * addr,int * addrlen);//第一个参数是在监听状态下接收套接字。//第二个参数是sockaddr,用来存储客户端地址的信息。//第三个参数用来指定这个地址的长度。//返回的是在监听状态下与这个套接字通信的套接字进行通信。//send(),并发送数据//int send (sockets,const char *)//第一个参数,套接字发送信息,//第二个参数,包含要发送的数据,//第三个参数,缓冲区的数据长度,//第四个参数,一些传输参数的设置//recv(),在套接字上接收数据//intrecv (sockets,char * buf,intlen,int flags//第一个参数,连接建立后的套接字,//第二个参数,接收的数据,//第三个参数,接收的数据长度,//第四个参数,int len=sizeof(SOCKADDR);While(true){//等待客户端请求的到来,socketsocckconn=accept(sock SRV,(sockaddr *) addrclient,len);charsendBuf[100];sprintf(sendBuf,欢迎% stotheserverprogram ~ 现在,让我们开始交谈.n ,inet _ ntoa(addr client . sin _ addr));send(sockConn,sendBuf,strlen(sendBuf) 1,0);//发送显示欢迎消息charrecvBuf[100];recv(sockConn,recvBuf,100,0);printf(%sn ,recvBuf);//接收第一条消息char * sockconname= clientprintf(‘我们可以聊五句’);intn=5;While (n-) {printf (%d次左:n ,n ^ 1);charrecvBuf[100];recv(sockConn,recvBuf,100,0);printf(%sSays:%sn ,sockConnName,recvBuf);//接收信息chartalk[100];printf( Pleaseenterwhatyouwanttosaynext( quit to exit):);gets(说话);send(sockConn,talk,strlen(talk) 1,0);//发送信息printf( n );} printf( n对话. n’);close socket(sock conn);} printf( n );系统(“暂停”);return0}//server.cpp

  #包括iostream

  #包括cstdio

  #包含Winsock2.h

  使用命名空间std

  int main()

  //加载套接字动态链接库(dll)

  WORD wVersionRequested

  WSADATA wsaData//这个结构用来接收Wjndows套接字的结构信息。

  int err

  wVersionRequested=MAKEWORD( 1,1);//请求1.1版WinSock库

  err=wsa startup(wVersionRequested,wsa data);

  如果(呃!=0 ) {

  return-1;//当返回值为0时,表示WSAStartup申请成功

  if ( LOBYTE( wsaData.wVersion)!=1 HIBYTE( wsaData.wVersion)!=1 ) {

  //检查低字节是否为1,高字节是否为1,以确定是否是我们请求的1.1版本。

  //否则,调用WSACleanup()清除信息,结束函数。

  WSACleanup();

  return-1;

  //创建套接字操作,建立流式套接字,返回套接字sockSrv。

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

  //第一个参数,指定地址簇(TCP/IP只能是AF_INET,或者写成PF_INET)

  //第二,选择socket的类型(streaming socket),第三,具体的地址族相关协议(0为自动)

  SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

  //sockSrv连接到本地地址。

  //int bind(SOCKET s,const struct sockaddr* name,int name len);

  //第一个参数,指定要绑定的套接字;

  //第二个参数,指定套接字的本地地址信息。根据使用的网络协议,地址结构会有所不同。

  //第三个参数,指定这个网络协议地址的长度

  //PS:struct sockaddr { u _ short sa _ family;char sa _ data[14];};

  //sa_family指定地址族,sa_data起到占用内存分配区域的作用。

  //在TCP/IP中,sockaddr可以用sockaddr_in结构代替,方便填写地址信息。

  //struct sockaddr _ in { short sin _ family;无符号短整型sin _ port结构in _ addr sin _ addrchar sin _ zero[8];};

  //sin_family表示地址族。对于IP地址,sin_family成员将始终是AF_INET。

  //sin_port指定将分配给套接字的端口。

  //sin_addr给出套接字的主机IP地址。

  //sin_zero[8]给出填充数,使sockaddr_in与sockaddr结构长度相同。

  //将IP地址指定为INADDR_ANY,允许套接字向分配给本地机器的任何IP地址发送或接收数据。

  //如果希望套接字只使用多个IP中的一个地址,可以指定实际地址并使用inet_addr()函数。

  SOCKADDR _ IN addrSrv

  addrSrv.sin_addr。S_un。s _ addr=htonl(in addr _ ANY);//将INADDR_ANY转换为网络字节顺序,调用htonl(long)或htons (integer)

  addrSrv.sin _ family=AF _ INET

  addr SRV . sin _ port=htons(6000);

  bind(sockSrv,(SOCKADDR*) addrSrv,sizeof(SOCKADDR));//第二个参数需要强制类型转换。

  //将套接字设置为监听模式(连接请求),listen()通知TCP服务器准备接收连接。

  //int listen(SOCKET s,int backlog);

  //第一个参数指定需要设置的套接字,第二个参数是(等待连接队列的最大长度)

  听(sockSrv,10);

  //accept(),接收连接,等待客户端连接。

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

  //第一个参数,监听状态下接收套接字。

  //第二个参数sockaddr用于保存客户端地址的信息。

  //第三个参数,用来指定这个地址的长度

  //返回的是这个监听状态下与套接字通信的套接字。

  //客户端与客户端通信。

  //send()在套接字上发送数据。

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

  //第一个参数,需要发送信息的套接字,

  //第二个参数包含要传输的数据,

  //第三个参数是缓冲区的数据长度,

  //第四个参数,一些传递参数的设置

  //recv(),在套接字上接收数据

  //int recv( SOCKET s,char* buf,int len,int flags);

  //第一个参数,连接建立后的套接字,

  //第二个参数,接收数据

  //第三个参数,接收数据的长度,

  //第四个参数,一些传递参数的设置

  SOCKADDR _ IN addrClient

  int len=sizeof(SOCKADDR);

  while(true){ //不断等待客户端请求的到来

  SOCKET sockConn=accept(sockSrv,(SOCKADDR*) addrClient,len);

  char send buf[100];

  sprintf(sendBuf,欢迎%s使用服务器程序~ 现在,让我们开始讨论吧.n ,inet _ ntoa(地址客户端。sin _ addr));

  send(sockConn,sendBuf,strlen(sendBuf) 1,0);//发送显示欢迎信息

  char recvBuf[100];

  recv(sockConn,recvBuf,100,0);

  printf(%sn ,recvBuf);//接收第一次信息

  char * sockConnName= Client

  printf(我们可以聊五句话);

  int n=5;

  while(n - ){

  printf(还剩%d次:n ,n ^ 1);

  char recvBuf[100];

  recv(sockConn,recvBuf,100,0);

  printf(%s说:%sn ,sockConnName,recvBuf);//接收信息

  char talk[100];

  printf(请输入你接下来要说的话(‘退出’退出):);

  获取(说话);

  send(sockConn,talk,strlen(talk) 1,0);//发送信息

  printf( n );

  printf( n并讲话. n’);

  关闭插座(插座连接器);

  printf( n );

  系统("暂停");

  返回0;

  }

  【cpp】查看plaincopyprint?

  //客户端。CPP # include iostream # include CST dio # include Winsock 2。h usingnamespacetdintmain(){//加载窝动态链接库(dll)WORDwVersionRequested;WSADATAwsaData//这结构是用于接收WjndowsSocket的结构信息的interrwVersionRequested=make word(1,1);//请求1.1版本的套接字库err=wsa startup(wVersionRequested,wsa data);如果(呃!=0){ return-1;//返回值为零的时候是表示成功申请wsa startup } if(LOBYTE(wsa数据。w版)!=1HIBYTE(wsaData.wVersion)!=1){//检查这个低字节是不是1,高字节是不是一以确定是否我们所请求的1.1版本//否则的话,调用WSACleanup()清除信息,结束函数WSACleanup();return-1;}//创建窝操作,建立流式套接字,返回套接字号sockClient //SOCKETsocket(intaf,inttype,int protocol);//第一个参数,指定地址簇(TCP/IP只能是AF_INET,也可写成PF_INET) //第二个,选择套接字的类型(流式套接字),第三个,特定地址家族相关协议(0为自动)socket SOCK client=socket(AF _ INET,SOCK_STREAM,0);//将套接字sockClient与远程主机相连//intconnect(SOCKETs,conststructsockaddr*name,int name len);//第一个参数:需要进行连接操作的套接字//第二个参数:设定所需要连接的地址信息//第三个参数:地址的长度SOCKADDR _ INaddrSrvaddrSrv.sin _ addr .S_un .s _ addr=inet _ addr( 127。0 .0 .1 );//本地回路地址是127.0.0.1;addr SRV . sin _ family=AF _ INETaddr SRV。sin _ port=htons(6000);connect(sockClient,(SOCKADDR*) addrSrv,sizeof(SOCKADDR));charrecvBuf[100];recv(sockClient,recvBuf,100,0);printf(%sn ,recvBuf);send(sockClient, Attention:AClienthasenter.n ,strlen(注意:AClienthasenter.n) 1,0);printf(我们可以聊五句话);intn=5;do{printf(n还剩%d次:,n);chartalk[100];printf( nplayinterwhatyouwanttosaynext( quit 退出):);获取(说话);send(sockClient,talk,strlen(talk) 1,0);//发送信息charrecvBuf[100];recv(sockClient,recvBuf,100,0);printf(%sSays:%sn , Server ,recvBuf);//接收信息} while(-n);printf(结束链接. n’);关闭socket(sock客户端);WSACleanup();//终止对套接字库的使用printf( n );系统("暂停");return0}//client.cpp

  #包括输入输出流

  #包括cstdio

  #包含Winsock2.h

  使用命名空间标准

  int main()

  //加载窝动态链接库(动态链接库)

  要求单词版本

  WSADATA wsaData//这结构是用于接收Wjndows插座的结构信息的

  int错误

  wVersionRequested=MAKEWORD( 1,1);//请求1.1版本的套接字库

  err=wsa startup(wVersionRequested,wsa data);

  如果(呃!=0 ) {

  return-1;//返回值为零的时候是表示成功申请WSAStartup

  if ( LOBYTE( wsaData.wVersion)!=1 HIBYTE( wsaData.wVersion)!=1 ) {

  //检查这个低字节是不是1,高字节是不是一以确定是否我们所请求的1.1版本

  //否则的话,调用WSACleanup()清除信息,结束函数

  WSACleanup();

  return-1;

  //创建窝操作,建立流式套接字,返回套接字号sockClient

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

  //第一个参数,指定地址簇(TCP/IP只能是AF_INET,也可写成PF_INET)

  //第二个,选择套接字的类型(流式套接字),第三个,特定地址家族相关协议(0为自动)

  SOCKET SOCK client=SOCKET(AF _ INET,SOCK_STREAM,0);

  //将套接字sockClient与远程主机相连

  //int connect( SOCKET s,const struct sockaddr* name,int name len);

  //第一个参数:需要进行连接操作的套接字

  //第二个参数:设定所需要连接的地址信息

  //第三个参数:地址的长度

  SOCKADDR _ IN addrSrv

  addrSrv.sin_addr .S_un .s _ addr=inet _ addr( 127。0 .0 .1 );//本地回路地址是127.0.0.1;

  addrSrv.sin _ family=AF _ INET

  地址服务。sin _ port=htons(6000);

  connect(sockClient,(SOCKADDR*) addrSrv,sizeof(SOCKADDR));

  char recvBuf[100];

  recv(sockClient,recvBuf,100,0);

  printf(%sn ,recvBuf);

  发送(sockClient,注意:客户已进入.n ,strlen(注意:一个客户已经进入.n) 1,0);

  printf(我们可以聊五句话);

  int n=5;

  printf(n还剩%d次:,n);

  char talk[100];

  printf( n请输入您接下来要说的话(‘退出’退出):);

  获取(说话);

  send(sockClient,talk,strlen(talk) 1,0);//发送信息

  char recvBuf[100];

  recv(sockClient,recvBuf,100,0);

  printf(%s说:%sn , Server ,recvBuf);//接收信息

  } while(-n);

  printf(结束链接. n’);

  关闭socket(sock客户端);

  WSACleanup();//终止对套接字库的使用

  printf( n );

  系统("暂停");

  返回0;

socket编程服务器代码和客户端代码,socket服务器端的代码