Esempio n. 1
0
//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);
}
Esempio n. 2
0
//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;

}
Esempio n. 3
0
/* 主程序 */
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;
}