2 单用户client向单线程服务器不停地发送数据

来源:互联网 发布:免费远程桌面控制软件 编辑:程序博客网 时间:2024/06/06 19:52

sever:


//服务端功能  只要有客户请求连接  在连接成功后,服务器向请求连接的客户发送"Hello!I am a server!"的信息。如果发送正确 显示所发送的字节数。//客户端的功能是  向服务器发出连接请求 在连接成功后,接收并显示从服务器收到的消息//通过面向连接的tcp协议实现#include<Winsock2.h>#include<stdio.h>#include<stdlib.h>#pragma comment(lib,"ws2_32.lib")#define DEFAULT_PORT 5050void main(){int iport=DEFAULT_PORT;WSADATA wsaData;SOCKET sListen,sAccept;int iLen;//int iSend;char buf[]="I am a server !.";struct sockaddr_in ser,cli;printf("-----------------------\n");printf("server waiting \n");printf("-----------------------\n");///启动if(WSAStartup(MAKEWORD(2,2),&wsaData))//检查协议栈 获得ws细节{printf("Failed to load Winsock.\n");return  ;}//建立socketsListen=socket(AF_INET,SOCK_STREAM,0);//建立socketif(sListen==INVALID_SOCKET){printf("socket()Failed:%d\n",WSAGetLastError());return  ;}//建立服务器地址   ser  sockaddr_in类型ser.sin_family=AF_INET;ser.sin_port=htons(iport);//host to shortser.sin_addr.s_addr=htonl(INADDR_ANY);//host to long if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR)//将socket和 端口和地址 绑定在一起  {printf("bind()Failed:%d\n",WSAGetLastError());return  ;}if(listen(sListen,5)==SOCKET_ERROR)//添加监听{printf("listen()Faild:%d\n",WSAGetLastError());return  ;}iLen=sizeof(cli);while(1){sAccept=accept(sListen,(struct sockaddr*)&cli,&iLen);//接收信息   cli 用来存放接收的 IP地址等信息  sockaddr_in   同时返回生成一个客户端socketif(sAccept==INVALID_SOCKET){printf("accept()Faild:%d \n",WSAGetLastError());break;}printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));//此时已经成功建立连接 接收服务器ip/*iSend=send(sAccept,buf,sizeof(buf),0);//发送信息 if(iSend==SOCKET_ERROR){printf("send()Faild:%d\n",WSAGetLastError());break;}else if(iSend==0) break;else{printf("send()byte:%d\n",iSend);printf("----------------------\n");}*/int iLen;while(1){iLen=recv(sAccept,buf,sizeof(buf),0);//从sClient接收if(iLen==0)return;else if(iLen==SOCKET_ERROR){printf("recv()Faild:%d\n",WSAGetLastError());return;}if(strcmp(buf,"exit")==0){printf("client %s has exited!\n",inet_ntoa(cli.sin_addr));break; }printf("recv() data from %s:  %s\n",inet_ntoa(cli.sin_addr),buf);}closesocket(sAccept);}closesocket(sListen);WSACleanup();return  ;}

client:



//服务端功能  只要有客户请求连接  在连接成功后,服务器向请求连接的客户发送"Hello!I am a server!"的信息。如果发送正确 显示所发送的字节数。//客户端的功能是  向服务器发出连接请求 在连接成功后,接收并显示从服务器收到的消息//通过面向连接的tcp协议实现#include<Winsock2.h>#include<stdio.h>#include<stdlib.h>#pragma comment(lib,"ws2_32.lib")#define DEFAULT_PORT 5050#define DATA_BUFFER 1024void main(int argc,char *argv[]){WSADATA wsaData;SOCKET sClient;int iPort=DEFAULT_PORT;int iLen;char buf[DATA_BUFFER];struct sockaddr_in ser;if(argc<2){printf("Usage:client[server IP address]\n");return;}memset(buf,0,sizeof(buf));if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)//检查协议栈 {printf("Failed to load Winsock.\n");return;}ser.sin_family=AF_INET;ser.sin_port=htons(iPort);ser.sin_addr.s_addr=inet_addr(argv[1]);sClient=socket(AF_INET,SOCK_STREAM,0);//建立客户端socketif(sClient==INVALID_SOCKET){printf("socket()Failed:%d\n",WSAGetLastError());return;}if(connect(sClient,(struct sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET)//将sClient同目标 地址连接  同时返回一个socket{printf("Connect()Failed:%d\n",WSAGetLastError());return;}else{//此时已经成功连接server/*iLen=recv(sClient,buf,sizeof(buf),0);//从sClient接收if(iLen==0)return;else if(iLen==SOCKET_ERROR){printf("recv()Faild:%d\n",WSAGetLastError());return;}printf("recv() data from server:  %s\n",buf);*/while(1){printf("请输入:");gets(buf);//读取一行if(strlen(buf)>=BUFSIZ) {printf("输入数据错误,程序结束!\n"); break;}else if(strlen(buf)==0){ printf("您未输入数据,请输入!\n");continue;}else{int iSend;iSend=send(sClient,buf,strlen(buf)+1,0);//发送信息 if(iSend==SOCKET_ERROR){printf("send()Faild:%d\n",WSAGetLastError());break;}else if(iSend==0) break;else{printf("send()byte:%d\n",iSend);printf("----------------------\n");}}if(strcmp(buf,"exit")==0) { printf("成功退出程序!"); break;}}}closesocket(sClient);WSACleanup();}








0 0
原创粉丝点击