//send packet with ACK no //int corr is for printEv purposes only. //corr: 1= dupl, 2= not dupl void sendACK(int last_cons_seq,struct sockaddr_in * cli_addr, int sockfd,char*dip,char*dpt,int corr){ char * pack = makePack(last_cons_seq,1); socklen_t cli_len = sizeof(*cli_addr); int charsent; if ((charsent = sendto(sockfd, pack, strlen(pack), 0,(struct sockaddr *)&*cli_addr, cli_len) == -1)) { perror("sws: error in sendto()"); exit(1); } if(corr==2){ printEvent(1,2,pack,"ACK",dip,dpt); } if(corr==1){ printEvent(1,1,pack,"ACK",dip,dpt); } free(pack); }
//establishes by waiting for SYN packet from sender. Returns SENDER seq # //verified int estConn( struct sockaddr_in *cli_addr,int sockfd,struct Info *c,char * dip, char * dpt){ //printf("Waiting for sender....\n"); char buffer[MAXBUFLEN]; socklen_t cli_len = sizeof(*cli_addr); int verify = recvfrom(sockfd, buffer, MAXBUFLEN-1 , 0,(struct sockaddr *)&*cli_addr, &cli_len); if(verify==-1){ printf("error on recvfrom()\nExit..\n"); exit(1); } buffer[verify] = '\0'; int type = isA(buffer); if(type == 1){ //got syn printEvent(2,2,buffer,"SYN",dip,dpt); c->syn_rcv+=1; c->total_bytes_rcv+=strlen(buffer); c->unique_bytes_rcv+=strlen(buffer); c->total_packets_rcv+=1; c->unique_packets_rcv+=1; } else{ return -1; } int s_seq = getSeqNo(buffer,1) + strlen(buffer); char * tosend = makePack(s_seq,1); //printf("tosend:\n%s\n",tosend); int charsent; if ((charsent = sendto(sockfd, tosend, strlen(tosend), 0,(struct sockaddr *)&*cli_addr, cli_len) == -1)) { perror("sws: error in sendto()"); exit(1); } printEvent(1,2,tosend,"ACK",dip,dpt); c->ack_sent+=1; free(tosend); return s_seq; }
/* 主程序 */ int main(int argc,char *argv[]) { int src_fd,dst_fd; int retval = RET_FAIL; struct sockaddr_in src_addr,dst_addr; int addr_sz = sizeof(struct sockaddr); /* 1.初始化udp */ printf("######### Client socket initial #########\n"); src_fd = socket(AF_INET,SOCK_DGRAM,0); if(src_fd < 0) { CLI_PRINT("Client socket create fail..\n"); return RET_FAIL; } CLI_PRINT("Client udp sock create success.\n"); /* 2.绑定 */ printf("######### socket bind #########\n"); src_addr.sin_family = AF_INET; src_addr.sin_addr.s_addr = htonl(INADDR_ANY); src_addr.sin_port = htons(SRC_PORT); retval = bind(src_fd,(struct sockaddr *)&src_addr,addr_sz); if(retval < 0) { CLI_PRINT("Client bind fail.\n"); return RET_FAIL; } CLI_PRINT("Client sock bind success.\n"); /* 3.组包 */ printf("######### making package #########\n"); //EN_MSG_TYPE type = TYPE_MSG_HEAD;// 消息类型 PST_FILE_HEADER head = (PST_FILE_HEADER)malloc(sizeof(ST_FILE_HEADER)); if(head == NULL) { CLI_PRINT("Malloc error.\n"); close(src_fd); return RET_FAIL; } memset(head,0,sizeof(ST_FILE_HEADER)); CLI_PRINT("Malloc done.\n"); //memcpy(head->name,"pisc_v1.0",strlen("pisc_v1.0")); strncpy(head->name,"pisc_v1.0",strlen("pisc_v1.0")); head->type = TYPE_PISC; // 文件类型,区别于消息类型 head->size = 1024; // 乱填的数据 head->version = 1; // 乱填的数据 head->crc = 555; // 乱填的数据 CLI_PRINT("memcpy done.\n"); PST_MSG message = makePack(TYPE_MSG_HEAD,&head); CLI_PRINT("Make package done..\n"); /* 4.发送测试数据 */ printf("######### Ready to send data #########\n"); dst_addr.sin_family = AF_INET; //dst_addr.sin_addr.s_addr = inet_addr("192.168.16.67"); dst_addr.sin_addr.s_addr = inet_addr("192.168.16.181"); dst_addr.sin_port = htons(UDP_PORT); while(1) { retval = sendto(src_fd,message,sizeof(ST_MSG),0,(struct sockaddr *)&dst_addr,addr_sz); if(retval < 0) { CLI_PRINT("Send data error.\n"); } CLI_PRINT("Client send %d bytes data.\n",retval); sleep(2); } free(head); free(msg); return RET_OK; }