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;