亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tcpuser.c

?? TCPIP協(xié)議包
?? C
字號:
/* User calls to TCP
 */
#include <stdio.h>
#include "global.h"
#include "timer.h"
#include "mbuf.h"
#include "netuser.h"
#include "socket.h"
#include "internet.h"
#include "tcp.h"
#include "ip.h"
#include "icmp.h"
#include "proc.h"

uint16 Tcp_window = DEF_WND;

struct tcb *
open_tcp(lsocket,fsocket,mode,window,r_upcall,t_upcall,s_upcall,tos,user)
struct socket *lsocket;	/* Local socket */
struct socket *fsocket;	/* Remote socket */
int mode;		/* Active/passive/server */
uint16 window;		/* Receive window (and send buffer) sizes */
void (*r_upcall)();	/* Function to call when data arrives */
void (*t_upcall)();	/* Function to call when ok to send more data */
void (*s_upcall)();	/* Function to call when connection state changes */
int tos;
int user;		/* User linkage area */
{
	struct connection conn;
	register struct tcb *tcb;

	if(lsocket == NULL){
		Net_error = INVALID;
		return NULL;
	}
	conn.local.address = lsocket->address;
	conn.local.port = lsocket->port;
	if(fsocket != NULL){
		conn.remote.address = fsocket->address;
		conn.remote.port = fsocket->port;
	} else {
		conn.remote.address = 0;
		conn.remote.port = 0;
	}
	if((tcb = lookup_tcb(&conn)) == NULL){
		if((tcb = create_tcb(&conn)) == NULL){
			Net_error = NO_MEM;
			return NULL;
		}
	} else if(tcb->state != TCP_LISTEN){
		Net_error = CON_EXISTS;
		return NULL;
	}
	tcb->user = user;
	if(window != 0)
		tcb->window = tcb->rcv.wnd = window;
	else
		tcb->window = tcb->rcv.wnd = Tcp_window;
	tcb->snd.wnd = 1;	/* Allow space for sending a SYN */
	tcb->r_upcall = r_upcall;
	tcb->t_upcall = t_upcall;
	tcb->s_upcall = s_upcall;
	tcb->tos = tos;
	switch(mode){
	case TCP_SERVER:
		tcb->flags.clone = 1;
	case TCP_PASSIVE:	/* Note fall-thru */
		settcpstate(tcb,TCP_LISTEN);
		break;
	case TCP_ACTIVE:
		/* Send SYN, go into TCP_SYN_SENT state */
		tcb->flags.active = 1;
		send_syn(tcb);
		settcpstate(tcb,TCP_SYN_SENT);
		tcp_output(tcb);
		break;
	}
	return tcb;
}
/* User send routine */
long
send_tcp(tcb,bpp)
register struct tcb *tcb;
struct mbuf **bpp;
{
	int32 cnt;

	if(tcb == NULL || bpp == NULL || *bpp == NULL){
		free_p(bpp);
		Net_error = INVALID;
		return -1;
	}
	cnt = len_p(*bpp);
	switch(tcb->state){
	case TCP_CLOSED:
		free_p(bpp);
		Net_error = NO_CONN;
		return -1;
	case TCP_LISTEN:
		if(tcb->conn.remote.address == 0 && tcb->conn.remote.port == 0){
			/* Save data for later */
			append(&tcb->sndq,bpp);
			tcb->sndcnt += cnt;
			break;
		}		
		/* Change state from passive to active */
		tcb->flags.active = 1;
		send_syn(tcb);
		settcpstate(tcb,TCP_SYN_SENT);	/* Note fall-thru */
	case TCP_SYN_SENT:
	case TCP_SYN_RECEIVED:
	case TCP_ESTABLISHED:
	case TCP_CLOSE_WAIT:
		append(&tcb->sndq,bpp);
		tcb->sndcnt += cnt;
		tcp_output(tcb);
		break;
	case TCP_FINWAIT1:
	case TCP_FINWAIT2:
	case TCP_CLOSING:
	case TCP_LAST_ACK:
	case TCP_TIME_WAIT:
		free_p(bpp);
		Net_error = CON_CLOS;
		return -1;
	}
	return (long)cnt;
}
/* User receive routine */
int32
recv_tcp(tcb,bpp,cnt)
register struct tcb *tcb;
struct mbuf **bpp;
int32 cnt;
{
	if(tcb == NULL || bpp == (struct mbuf **)NULL){
		Net_error = INVALID;
		return -1;
	}
	if(tcb->rcvcnt == 0){
		/* If there's nothing on the queue, our action depends on what state
		 * we're in (i.e., whether or not we're expecting any more data).
		 * If no more data is expected, then simply return 0; this is
		 * interpreted as "end of file". Otherwise return -1.
		 */
		switch(tcb->state){
		case TCP_LISTEN:
		case TCP_SYN_SENT:
		case TCP_SYN_RECEIVED:
		case TCP_ESTABLISHED:
		case TCP_FINWAIT1:
		case TCP_FINWAIT2:
			Net_error = WOULDBLK;
			return -1;
		case TCP_CLOSED:
		case TCP_CLOSE_WAIT:
		case TCP_CLOSING:
		case TCP_LAST_ACK:
		case TCP_TIME_WAIT:
			*bpp = NULL;
			return 0;
		}
	}
	/* cnt == 0 means "I want it all" */
	if(cnt == 0)
		cnt = tcb->rcvcnt;
	/* See if the user can take all of it */
	if(tcb->rcvcnt <= cnt){
		cnt = tcb->rcvcnt;
		*bpp = tcb->rcvq;
		tcb->rcvq = NULL;
	} else {
		*bpp = ambufw(cnt);
		pullup(&tcb->rcvq,(*bpp)->data,cnt);
		(*bpp)->cnt = cnt;
	}
	tcb->rcvcnt -= cnt;
	tcb->rcv.wnd += cnt;
	/* Do a window update if it was less than one packet and now it's more */
	if(tcb->rcv.wnd > tcb->mss && tcb->rcv.wnd - cnt < tcb->mss){
		tcb->flags.force = 1;
		tcp_output(tcb);
	}
	return (int)cnt;
}
/* This really means "I have no more data to send". It only closes the
 * connection in one direction, and we can continue to receive data
 * indefinitely.
 */
int
close_tcp(tcb)
register struct tcb *tcb;
{
	if(tcb == NULL){
		Net_error = INVALID;
		return -1;
	}
	switch(tcb->state){
	case TCP_CLOSED:
		return 0;	/* Unlikely */
	case TCP_LISTEN:
	case TCP_SYN_SENT:
		close_self(tcb,NORMAL);
		return 0;
	case TCP_SYN_RECEIVED:
	case TCP_ESTABLISHED:
		tcb->sndcnt++;
		tcb->snd.nxt++;
		settcpstate(tcb,TCP_FINWAIT1);
		tcp_output(tcb);
		return 0;
	case TCP_CLOSE_WAIT:
		tcb->sndcnt++;
		tcb->snd.nxt++;
		settcpstate(tcb,TCP_LAST_ACK);
		tcp_output(tcb);
		return 0;
	case TCP_FINWAIT1:
	case TCP_FINWAIT2:
	case TCP_CLOSING:
	case TCP_LAST_ACK:
	case TCP_TIME_WAIT:
		Net_error = CON_CLOS;
		return -1;
	}
	return -1;	/* "Can't happen" */
}
/* Delete TCB, free resources. The user is not notified, even if the TCB is
 * not in the TCP_CLOSED state. This function should normally be called by the
 * user only in response to a state change upcall to TCP_CLOSED state.
 */
int
del_tcp(conn)
struct tcb *conn;
{
	register struct tcb *tcb;
	struct tcb *tcblast = NULL;
	struct reseq *rp,*rp1;

	/* Remove from list */
	for(tcb=Tcbs;tcb != NULL;tcblast = tcb,tcb = tcb->next)
		if(tcb == conn)
			break;
	if(tcb == NULL){
		Net_error = INVALID;
		return -1;	/* conn was NULL, or not on list */ 
	}
	if(tcblast != NULL)
		tcblast->next = tcb->next;
	else
		Tcbs = tcb->next;	/* was first on list */

	stop_timer(&tcb->timer);
	for(rp = tcb->reseq;rp != NULL;rp = rp1){
		rp1 = rp->next;
		free_p(&rp->bp);
		free(rp);
	}
	tcb->reseq = NULL;
	free_p(&tcb->rcvq);
	free_p(&tcb->sndq);
	free(tcb);
	return 0;
}
/* Return 1 if arg is a valid TCB, 0 otherwise */
int
tcpval(tcb)
struct tcb *tcb;
{
	register struct tcb *tcb1;

	if(tcb == NULL)
		return 0;	/* Null pointer can't be valid */
	for(tcb1=Tcbs;tcb1 != NULL;tcb1 = tcb1->next){
		if(tcb1 == tcb)
			return 1;
	}
	return 0;
}
/* Kick a particular TCP connection */
int
kick_tcp(tcb)
register struct tcb *tcb;
{
	if(!tcpval(tcb))
		return -1;
	tcb->flags.force = 1;	/* Send ACK even if no data */
	tcb->backoff = 0;
	tcp_timeout(tcb);
	return 0;
}
/* Kick all TCP connections to specified address; return number kicked */
int
kick(addr)
int32 addr;
{
	register struct tcb *tcb;
	int cnt = 0;

	for(tcb=Tcbs;tcb != NULL;tcb = tcb->next){
		if(tcb->conn.remote.address == addr){
			kick_tcp(tcb);
			cnt++;
		}
	}
	return cnt;
}
/* Clear all TCP connections */
void
reset_all()
{
	register struct tcb *tcb,*tcbnext;

	for(tcb=Tcbs;tcb != NULL;tcb = tcbnext){
		tcbnext = tcb->next;
		reset_tcp(tcb);
	}
	kwait(NULL);	/* Let the RSTs go forth */
}
void
reset_tcp(tcb)
register struct tcb *tcb;
{
	struct tcp fakeseg;
	struct ip fakeip;

	if(tcb == NULL)
		return;
	if(tcb->state != TCP_LISTEN){
		/* Compose a fake segment with just enough info to generate the
		 * correct RST reply
		 */
		memset(&fakeseg,0,sizeof(fakeseg));
		memset(&fakeip,0,sizeof(fakeip));
		fakeseg.dest = tcb->conn.local.port;
		fakeseg.source = tcb->conn.remote.port;
		fakeseg.flags.ack = 1;
		/* Here we try to pick a sequence number with the greatest likelihood
		 * of being in his receive window.
		 */
		fakeseg.ack = tcb->snd.nxt + tcb->snd.wnd - 1;
		fakeip.dest = tcb->conn.local.address;
		fakeip.source = tcb->conn.remote.address;
		fakeip.tos = tcb->tos;
		reset(&fakeip,&fakeseg);
	}
	close_self(tcb,RESET);
}
#ifdef	notused
/* Return character string corresponding to a TCP well-known port, or
 * the decimal number if unknown.
 */
char *
tcp_port(n)
uint16 n;
{
	static char buf[32];

	switch(n){
	case IPPORT_ECHO:
		return "echo";
	case IPPORT_DISCARD:
		return "discard";
	case IPPORT_FTPD:
		return "ftp_data";
	case IPPORT_FTP:
		return "ftp";	
	case IPPORT_TELNET:
		return "telnet";
	case IPPORT_SMTP:
		return "smtp";
	case IPPORT_POP:
		return "pop";
	default:
		sprintf(buf,"%u",n);
		return buf;
	}
}
#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
69久久夜色精品国产69蝌蚪网| 国产91精品在线观看| 欧美三级日韩在线| 亚洲精品菠萝久久久久久久| 91视频国产资源| 亚洲黄色片在线观看| 欧美视频中文字幕| 麻豆freexxxx性91精品| 337p日本欧洲亚洲大胆精品 | 日韩精品综合一本久道在线视频| 日本欧美一区二区三区乱码| 欧美成人午夜电影| 成人自拍视频在线| 一区二区三区丝袜| 欧美一级在线视频| 成人在线视频一区二区| 亚洲精品成a人| 日韩一区二区中文字幕| 国产凹凸在线观看一区二区| 亚洲久本草在线中文字幕| 91精品视频网| 国产99久久久精品| 亚洲一区二区在线观看视频| 日韩欧美亚洲另类制服综合在线| 久久99精品久久久| 亚洲欧美综合网| 91精品国产一区二区三区香蕉| 国产一区二区三区av电影 | 亚洲色图.com| 欧美精三区欧美精三区| 国产精品一区二区不卡| 一区二区三区日韩精品| 欧美xxxx在线观看| 91久久久免费一区二区| 国产一区二区三区四区五区入口| 亚洲人成精品久久久久久| 日韩一区二区在线看| 99久久亚洲一区二区三区青草| 日韩在线一二三区| 亚洲日本在线观看| 欧美精品一区男女天堂| 欧美无砖砖区免费| 懂色av中文字幕一区二区三区| 亚洲成人免费视频| 国产精品成人网| 欧美刺激午夜性久久久久久久| 色综合久久久久久久久| 国产福利一区二区| 日韩高清国产一区在线| 国产精品妹子av| 久久综合精品国产一区二区三区| 欧美综合一区二区三区| 不卡一卡二卡三乱码免费网站| 奇米精品一区二区三区在线观看| 亚洲精品欧美二区三区中文字幕| 国产婷婷色一区二区三区在线| 欧美一区二区三区成人| 在线免费一区三区| 成人国产精品免费观看动漫| 国产一区二区按摩在线观看| 日本人妖一区二区| 亚洲制服丝袜一区| 一区二区三区视频在线看| 国产精品你懂的| 亚洲国产精华液网站w| 精品卡一卡二卡三卡四在线| 91麻豆精品国产91久久久 | 制服丝袜av成人在线看| 欧美在线短视频| 91精品福利在线| 色综合久久中文综合久久97| 99re亚洲国产精品| 91香蕉视频污| 色老头久久综合| 91麻豆福利精品推荐| 色综合久久久久| 日本韩国欧美一区| 色综合久久久久网| 色噜噜久久综合| 在线观看av一区| 欧美日韩一级视频| 欧美久久一二区| 日韩无一区二区| 久久伊人中文字幕| 久久免费午夜影院| 中文字幕+乱码+中文字幕一区| 国产色一区二区| 中文字幕中文字幕中文字幕亚洲无线| 久久嫩草精品久久久精品| 国产三级精品在线| 欧美国产一区二区| 亚洲欧洲综合另类| 亚洲国产美国国产综合一区二区| 午夜精品爽啪视频| 日韩黄色小视频| 精品亚洲成a人| 成人午夜av影视| 91久久人澡人人添人人爽欧美| 欧美日韩高清一区二区三区| 欧美一区二区在线视频| 久久青草国产手机看片福利盒子| 国产视频不卡一区| 亚洲一区二区三区在线| 美女诱惑一区二区| 成人av在线播放网址| 欧美无人高清视频在线观看| 欧美一区二区高清| 国产精品水嫩水嫩| 亚洲大片免费看| 国产黄人亚洲片| 欧美午夜片在线看| 久久影视一区二区| 一区二区三区四区蜜桃| 精品制服美女丁香| 99精品欧美一区二区三区综合在线| 欧美色综合网站| 国产日韩欧美电影| 亚洲一卡二卡三卡四卡五卡| 激情文学综合丁香| 欧亚洲嫩模精品一区三区| 精品久久久久久久人人人人传媒| 亚洲欧洲另类国产综合| 午夜一区二区三区视频| 国产高清精品网站| 欧美精品 国产精品| 国产精品三级电影| 男男成人高潮片免费网站| 成人美女在线观看| 日韩精品在线一区| 一区二区在线免费| 国产精品123| 这里只有精品视频在线观看| 国产精品久久久久aaaa| 精品亚洲国内自在自线福利| 欧美三级日韩三级| 国产精品嫩草99a| 韩国av一区二区三区四区| 欧美性猛交xxxx乱大交退制版| 国产日韩欧美精品综合| 另类专区欧美蜜桃臀第一页| 色婷婷激情一区二区三区| 国产三级欧美三级日产三级99 | 日本伊人精品一区二区三区观看方式| 成人免费高清在线观看| 日韩视频国产视频| 天涯成人国产亚洲精品一区av| 福利一区二区在线| 精品久久久久一区二区国产| 首页国产欧美日韩丝袜| 在线视频你懂得一区二区三区| 亚洲国产岛国毛片在线| 极品销魂美女一区二区三区| 欧美放荡的少妇| 午夜精品一区二区三区电影天堂| 91麻豆.com| 亚洲人成网站影音先锋播放| 成人福利视频网站| 久久久国产精品麻豆| 国产永久精品大片wwwapp| 欧美成人官网二区| 美女精品一区二区| 欧美一区二区私人影院日本| 日韩成人一区二区| 欧美人妖巨大在线| 亚洲v精品v日韩v欧美v专区| 欧美色爱综合网| 亚洲国产视频在线| 欧美日韩国产不卡| 天天综合天天综合色| 91精品婷婷国产综合久久竹菊| 天天综合色天天| 欧美一区国产二区| 久久国产婷婷国产香蕉| 欧美电视剧免费观看| 国内国产精品久久| 国产丝袜在线精品| 不卡视频一二三| 亚洲免费在线视频一区 二区| 日本乱码高清不卡字幕| 亚洲成人在线网站| 在线不卡中文字幕播放| 免费三级欧美电影| 久久亚洲一级片| 成人激情动漫在线观看| 亚洲免费观看高清| 欧美日韩精品一区视频| 日韩av一区二区在线影视| 欧美va天堂va视频va在线| 国产伦精品一区二区三区视频青涩 | xnxx国产精品| 成人午夜精品一区二区三区| 亚洲男人的天堂在线aⅴ视频| 欧美三级午夜理伦三级中视频| 丝袜诱惑亚洲看片| 久久嫩草精品久久久精品一| 99久久精品国产精品久久| 亚洲线精品一区二区三区| 日韩三级视频在线看| 丰满亚洲少妇av| 亚洲影院理伦片|