#include <stdafx.h>
#include <Winsock2.h>
#include <stdio.h>
#include <iostream.h>
//#include <udp.h>
#define MAXLINE 500 //定义文本队列长度
#define SERV_PORT 7 //服务器端口号
#pragma comment(lib,"ws2_32.lib")
//void printerr();
//socket初始化
void StartUp()
{
WSADATA wsaData;
WORD version=MAKEWORD(2,0);
int ret=WSAStartup(version,&wsaData);
if(ret!=0)
printf("初始化失败");
}
//free the socket
void CleanUp()
{
if(WSACleanup()!=0)
printf((char*)WSAGetLastError());
}
//获取用户输入并与服务器通信
void dg_cli_simple(FILE*fp,int sockfd,LPSOCKADDR pservaddr,int servlen)
{
char sendline[20],recvline[MAXLINE+1];
char pre1[20]="aaaaaaghijklmnsssss",pre2[20]="bbbbbbhijklmnottttt",pre3[20]="ccccccijklmnopvvvvv";
sockaddr_in servaddr;
int n,count=0,miss=0;
char ndg[500];//待循环发送的数据
//memset(sendline,0,500);//清0 sendline
memset(recvline,0,MAXLINE);//清0 recvline
for(int i=0;i<300;i++)
{
memset(sendline,0,sizeof(sendline));
switch(i%10){
case(0):
case(3):
case(6):memcpy(sendline,pre1,sizeof(sendline));break;
case(1):
case(4):
case(7):
case(9):memcpy(sendline,pre2,sizeof(sendline));break;
case(2):
case(5):
case(8):memcpy(sendline,pre3,sizeof(sendline));break;
/*case(3):memcpy(sendline,pre1,sizeof(sendline));break;
case(4):memcpy(sendline,pre2,sizeof(sendline));break;
case(5):memcpy(sendline,pre3,sizeof(sendline));break;
case(6):memcpy(sendline,pre1,sizeof(sendline));break;
case(7):memcpy(sendline,pre2,sizeof(sendline));break;
case(8):memcpy(sendline,pre3,sizeof(sendline));break;
case(9):memcpy(sendline,pre2,sizeof(sendline));
break;*/
}
//printf("\r\n\r\n");
//cout<<"客户端第"<<i+1<<"次发送数据"<<endl;
//printf("客户端发送数据:%s\r\n",&sendline);
//count++;
//sendline[20]="abcdefghijklmnopqrs";
//memset(sendline+sizeof('a'),66,1);
//memset(sendline+2,'abcd',sizeof('abcd'));//置sendline fgets(sendline,MAXLINE,fp)!=NULL
//printf("%d",sizeof(好));
//将用户输入发送给服务器
if(sendline=="EOF")
return;
//* 将读入行发送到服务器套接口
if((sendto(sockfd,sendline,strlen(sendline),0,pservaddr,servlen))==SOCKET_ERROR)
{
printf("SEND error");
// printerr();
system("pause");
return;
}
// len = servlen;
//*从读入回射,读入字节数为n, 不关心从何处读入
if((n=recvfrom(sockfd,recvline,MAXLINE,0,NULL, NULL))==SOCKET_ERROR)
{
printf("\r\n接收数据错误\r\n");
miss++;
//printerr();
//system("pause");
//return;
}
else
if(n>0)
{
recvline[n]=0;
//if(count>0)printf("客户端收到数据:");
//if(fputs(recvline,stdout)==EOF)
//printf("fputs error");
}
memset(&servaddr,0,sizeof(servaddr));
}
printf("共发送%d数据报,丢失%d个,丢包率为%f",i,miss,(float)miss/(float)i);
system("pause");
}
/*while(fgets(sendline,MAXLINE,fp)!=NULL)// 从键盘读入一行
{
count++;
//将用户输入发送给服务器
if(sendline=="EOF")
return;
//* 将读入行发送到服务器套接口
if((sendto(sockfd,sendline,strlen(sendline),0,pservaddr,servlen))==SOCKET_ERROR)
{
printf("SEND error");
// printerr();
return;
}
// len = servlen;
//*从读入回射,读入字节数为n, 不关心从何处读入
if((n=recvfrom(sockfd,recvline,MAXLINE,0,NULL, NULL))==SOCKET_ERROR)
{
printf("\r\n接收数据错误\r\n");
//printerr();
return;
}
else
if(n>0)
{
recvline[n]=0;
if(count>1)printf("客户端收到数据:\r\n");
if(fputs(recvline,stdout)==EOF)
printf("fputs error");
}
printf("\r\n客户端发送数据:\r\n");
memset(&servaddr,0,sizeof(servaddr));
}} */
int main(int argc,char*argv[])
{
int sockfd;
struct sockaddr_in servaddr;
//struct socklen_t len;
int por;
char addr[50];
StartUp();
//创建数据报套接字
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
printf("socket error");
//printerr();
CleanUp();
return 0;
}
// printf("请输入你要连接的端口: ");
// scanf("%s",&por);
printf("客户端向服务器循环发送3组数据300次,并等待回射信息。\r\n若接收回射信息错误即算丢包。\r\n\r\n");
printf("请输入你要连接的IP地址:");
scanf("%16s",addr);
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
servaddr.sin_addr.s_addr=inet_addr(addr);
//设置接收超时
int nTimeOver=10;//超时时限为1000ms
setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTimeOver,sizeof(nTimeOver));
//调用函数与服务器交互信息
dg_cli_simple(stdin,sockfd,(LPSOCKADDR)&servaddr,sizeof(servaddr));
printf("\r\n\r\n");
if((closesocket(sockfd))==SOCKET_ERROR)
{
printf("close error");
//printerr();
CleanUp();
return 0;
}
CleanUp();
return 0;
}
- 1
- 2
- 3
- 4
前往页