Ejemplo n.º 1
0
int main() {
	//用于丢包率的随机数种子
	srand(time(NULL));

	//连接到SIP进程并获得TCP套接字描述符
	int sip_conn = connectToSIP();
	if(sip_conn<0) {
		printf("can not connect to the local SIP process\n");
	}

	//初始化STCP服务器
	stcp_server_init(sip_conn);

	//在端口SERVERPORT1上创建STCP服务器套接字 
	int sockfd= stcp_server_sock(SERVERPORT1);
	if(sockfd<0) {
		printf("can't create stcp server\n");
		exit(1);
	}
	//监听并接受来自STCP客户端的连接 
	stcp_server_accept(sockfd);

	//在端口SERVERPORT2上创建另一个STCP服务器套接字
	int sockfd2= stcp_server_sock(SERVERPORT2);
	if(sockfd2<0) {
		printf("can't create stcp server\n");
		exit(1);
	}
	//监听并接受来自STCP客户端的连接 
	stcp_server_accept(sockfd2);

	char buf1[6];
	char buf2[7];
	int i;
	//接收来自第一个连接的字符串
	for(i=0;i<5;i++) {
		stcp_server_recv(sockfd,buf1,6);
		printf("recv string: %s from connection 1\n",buf1);
	}
	//接收来自第二个连接的字符串
	for(i=0;i<5;i++) {
		stcp_server_recv(sockfd2,buf2,7);
		printf("recv string: %s from connection 2\n",buf2);
	}

	sleep(WAITTIME);

	//关闭STCP服务器 
	if(stcp_server_close(sockfd)<0) {
		printf("can't destroy stcp server\n");
		exit(1);
	}				
	if(stcp_server_close(sockfd2)<0) {
		printf("can't destroy stcp server\n");
		exit(1);
	}				

	//断开与SIP进程之间的连接
	disconnectToSIP(sip_conn);
}
Ejemplo n.º 2
0
int main() {
	//用于丢包率的随机数种子
	srand(time(NULL));

	//启动重叠网络层并获取重叠网络层TCP套接字描述符
	int son_conn = son_start();
	if(son_conn<0) {
		printf("can not start overlay network\n");
	}

	//初始化STCP服务器
	stcp_server_init(son_conn);

	//在端口SERVERPORT1上创建STCP服务器套接字 
	int sockfd= stcp_server_sock(SERVERPORT1);
	if(sockfd<0) {
		printf("can't create stcp server\n");
		exit(1);
	}
	//监听并接受来自STCP客户端的连接 
	stcp_server_accept(sockfd);

	//在端口SERVERPORT2上创建另一个STCP服务器套接字
	int sockfd2= stcp_server_sock(SERVERPORT2);
	if(sockfd2<0) {
		printf("can't create stcp server\n");
		exit(1);
	}
	//监听并接受来自STCP客户端的连接 
	stcp_server_accept(sockfd2);

	char buf1[6];
	char buf2[7];
	int i;
	//接收来自第一个连接的字符串
	for(i=0;i<5;i++) {
		stcp_server_recv(sockfd,buf1,6);
		printf("recv string: %s from connection 1\n",buf1);
	}
	//接收来自第二个连接的字符串
	for(i=0;i<5;i++) {
		stcp_server_recv(sockfd2,buf2,7);
		printf("recv string: %s from connection 2\n",buf2);
	}

	//sleep(WAITTIME);

	//关闭STCP服务器 
	if(stcp_server_close(sockfd)<0) {
		printf("can't destroy stcp server\n");
		exit(1);
	}				
	if(stcp_server_close(sockfd2)<0) {
		printf("can't destroy stcp server\n");
		exit(1);
	}				

	//停止重叠网络层
	son_stop(son_conn);
}
Ejemplo n.º 3
0
int main() {
	//用于丢包率的随机数种子
	srand(time(NULL));

	//启动重叠网络层并获取重叠网络层TCP套接字描述符
	int son_conn = son_start();
	if(son_conn<0) {
		printf("can not start overlay network\n");
	}

	//初始化STCP服务器
	stcp_server_init(son_conn);

	//在端口SERVERPORT1上创建STCP服务器套接字 
	int sockfd= stcp_server_sock(SERVERPORT1);
	if(sockfd<0) {
		printf("can't create stcp server\n");
		exit(1);
	}
	//监听并接受来自STCP客户端的连接 
	stcp_server_accept(sockfd);

	//首先接收文件长度, 然后接收文件数据 
	int fileLen;
	stcp_server_recv(sockfd,&fileLen,sizeof(int));
	printf("get file length: %d\n",fileLen);
	char* buf = (char*) malloc(fileLen);
	stcp_server_recv(sockfd,buf,fileLen);
	//int i=0;
	/*for(;i<fileLen;i++)
	{
		printf("%c",buf[i]);
	}*/
	//将接收到的文件数据保存到文件receivedtext.txt中
	FILE* f;
	f = fopen("receivedtext.txt","w");
	fwrite(buf,fileLen,1,f);
	fclose(f);
	free(buf);

	sleep(WAITTIME);

	//关闭STCP服务器 
	if(stcp_server_close(sockfd)<0) {
		printf("can't destroy stcp server\n");
		exit(1);
	}				

	//停止重叠网络层
	son_stop(son_conn);
}
Ejemplo n.º 4
0
int main() {
	//用于丢包率的随机数种子
	srand(time(NULL));

	//连接到SIP进程并获得TCP套接字描述符
	int sip_conn = connectToSIP();
	if(sip_conn<0) {
		printf("can not connect to the local SIP process\n");
	}

	//初始化STCP服务器
	stcp_server_init(sip_conn);

	//在端口SERVERPORT1上创建STCP服务器套接字 
	int sockfd= stcp_server_sock(SERVERPORT1);
	if(sockfd<0) {
		printf("can't create stcp server\n");
		exit(1);
	}
	//监听并接受来自STCP客户端的连接 
	stcp_server_accept(sockfd);

	//首先接收文件长度, 然后接收文件数据
	int fileLen;
	stcp_server_recv(sockfd,&fileLen,sizeof(int));
	char* buf = (char*) malloc(fileLen);
	stcp_server_recv(sockfd,buf,fileLen);

	//将接收到的文件数据保存到文件receivedtext.txt中
	FILE* f;
	f = fopen("receivedtext.txt","a");
	fwrite(buf,fileLen,1,f);
	fclose(f);
	free(buf);

	//等待一会儿
	sleep(WAITTIME);

	//关闭STCP服务器 
	if(stcp_server_close(sockfd)<0) {
		printf("can't destroy stcp server\n");
		exit(1);
	}				

	//断开与SIP进程之间的连接
	disconnectToSIP(sip_conn);
}
Ejemplo n.º 5
0
int main() {
	//用于丢包率的随机数种子
	srand(time(NULL));

	//连接到SIP进程并获得TCP套接字描述符
	int sip_conn = connectToSIP();
	if(sip_conn<0) {
		printf("can not connect to the local SIP process\n");
	}

	//初始化STCP服务器
	stcp_server_init(sip_conn);

	//启动seghandler线程
	pthread_t seghandle_thread;
	int rc;
	rc = pthread_create(&seghandle_thread, NULL, seghandler, &sip_conn);
	if (rc) {
		printf("ERROR; return code from pthread_create() is %d\n", rc);
		exit(-1);
	}

	//在端口SERVERPORT1上创建STCP服务器套接字 
	int sockfd= stcp_server_sock(SERVERPORT1);
	if(sockfd<0) {
		printf("can't create stcp server\n");
		exit(1);
	}
	//监听并接受来自STCP客户端的连接 
	stcp_server_accept(sockfd);

	char hostname[50];
	printf("Enter server name to connect:");
	scanf("%s",hostname);
	int server_nodeID = topology_getNodeIDfromname(hostname);
	if(server_nodeID == -1) {
		printf("host name error!\n");
		exit(1);
	} else {
		printf("connecting to node %d\n",server_nodeID);
	}

	//在端口87上创建STCP客户端套接字, 并连接到STCP服务器端口88
	int sockfd2 = stcp_client_sock(CLIENTPORT1);
	if(sockfd2<0) {
		printf("fail to create stcp client sock");
		exit(1);
	}
	if(stcp_client_connect(sockfd2,server_nodeID,SERVERPORT1)<0) {
		printf("fail to connect to stcp server\n");
		exit(1);
	}

	char buf1[6];

	//接收来自第一个连接的字符串
	int i;
	for(i=0;i<5;i++) {
		stcp_server_recv(sockfd,buf1,6);
		printf("recv string: %s from connection 1\n",buf1);
	}
	//通过第二个连接发送字符串
    char mydata2[7] = "byebye";
	for(i=0;i<5;i++){
      	stcp_client_send(sockfd2, mydata2, 7);
		printf("send string:%s to connection 2\n",mydata2);	
    }

	sleep(WAITTIME);

	//关闭STCP服务器 
	if(stcp_server_close(sockfd)<0) {
		printf("can't destroy stcp server\n");
		exit(1);
	}
	sleep(WAITTIME);
	//关闭连接
	if(stcp_client_disconnect(sockfd2)<0) {
		printf("fail to disconnect from stcp server\n");
		exit(1);
	}
	
	//断开与SIP进程之间的连接
	disconnectToSIP(sip_conn);
}
Ejemplo n.º 6
0
/*when this user want to send message,get info frome this user*/
void *GetTask(void *arg)
{
	user* usr=(user *)arg;
	char sendbuf[MAXLINE];
	char temp[MAXLINE];
	int n;
	int state;
	while(1)
	{
		memset(sendbuf,0,sizeof(sendbuf));
		memset(temp,0,sizeof(temp));
		n = stcp_server_recv(usr->sock,sendbuf,MAXLINE);		//get the message
		if(n<0)					//the user want to send
		{
			perror("ERROR reading from socket");
			return NULL;	
		}
		pthread_mutex_lock(&(usr->usrlock));
		state=usr->state;
		pthread_mutex_unlock(&(usr->usrlock));
		printf("state: %d  :buf: %s\n",state,sendbuf);
		switch(state){
			case 1:			//get name and come in
				if(sendbuf[0]=='1'){
					strcpy(usr->name,&sendbuf[1]);
					user* p=head;
					while(1){	//wait for all user get the old msg 
						//then update
						pthread_mutex_lock(&lock);
						if(count>0)
						{
							pthread_mutex_unlock(&lock);
							sleep(1);
						}
						else
							break;
					}	

					while(p!=NULL)		//if this name has been used
					{
						if(strcmp(p->name,usr->name)==0)
						{
							pthread_mutex_unlock(&lock);
							break;
						}
						p=p->next;
					}
					if(p==NULL)
					{
						usr->next=head;
						head=usr;
						count=userCount;
						userCount++;
						usr->fcount=0;
						msgid=usr->id;
						strcpy(msgbuf,"&&&&& ");
						strcat(msgbuf,usr->name);
						strcat(msgbuf," come in &&&&\n");
						pthread_cond_broadcast(&has_message);
						pthread_mutex_unlock(&lock);
						pthread_mutex_lock(&(usr->usrlock));
						usr->state=2;		//read for send msg to others
						pthread_mutex_unlock(&(usr->usrlock));
						sendbuf[0]='2';		
						stcp_server_send(usr->sock,sendbuf,MAXLINE);//tell user he has log in
						break;
					}
					pthread_mutex_unlock(&lock);
					sendbuf[0]='1';
					stcp_server_send(usr->sock,sendbuf,MAXLINE);
					//printf("1-2%s\n",sendbuf);
					break;
				}
				else if(sendbuf[0]=='4')
				{
					pthread_mutex_lock(&(usr->usrlock));
					usr->state=5;
					pthread_mutex_unlock(&(usr->usrlock));
					return NULL;	
				}
				break;

			case 2:			//the user want to send this msg
				if(sendbuf[0]=='2')
				{
					while(1){	//wait for all user get the old msg 
						//then update
						pthread_mutex_lock(&lock);
						if(count>0)
						{
							pthread_mutex_unlock(&lock);
							sleep(1);
						}
						else
							break;
					}	
					strcpy(msgbuf,sendbuf);
					count=userCount-1;
					msgid=usr->id;
					pthread_cond_broadcast(&has_message); //let the waiters know it
					printf("id:%d   msgbuf: %s",(int)msgid,msgbuf);
					pthread_mutex_unlock(&lock);
				}
				else if(sendbuf[0]=='3')	//user want to list all members
				{
					//printf("list 2-3\n");
					memset(sendbuf,0,sizeof(sendbuf));
					sendbuf[0]='3';
					pthread_mutex_lock(&lock);
					user* p=head;
					while(p!=NULL){
						if(strlen(sendbuf)+strlen(p->name)>MAXLINE)break;
						strcat(sendbuf,p->name);
						strcat(sendbuf," |*| ");
						p=p->next;
					}
					pthread_mutex_unlock(&lock);
					strcat(sendbuf,"\n");
					stcp_server_send(usr->sock,sendbuf,MAXLINE);
				}
				else if(sendbuf[0]=='@')	//send to the one
				{
					strcpy(temp,sendbuf);
					char *delim="@";
					strtok(temp,delim);
					strcpy(temp,&temp[1]);
					char *p=strtok(NULL,delim);
					//printf("%s,%s\n",temp,p);
					memset(sendbuf,0,sizeof(sendbuf));
					strcpy(sendbuf,"2");
					strcat(sendbuf,usr->name);
					//printf("%s\n",sendbuf);
					strcat(sendbuf, " (private): ");
					strcat(sendbuf,p);
					pthread_mutex_lock(&lock);
					user *q=head;
					while(q!=NULL){
						if(strcmp(q->name,temp)==0)			//find this gay
						{
							stcp_server_send(q->sock,sendbuf,MAXLINE);
							break;
						}
						q=q->next;
					}
					pthread_mutex_unlock(&lock);
				}
				else if(sendbuf[0]=='$')			//make friend
				{
					strcpy(temp,&sendbuf[1]);
					int l=strlen(temp);
					if(temp[l-1]=='\n')temp[l-1]=0;
					if(strcmp(temp,usr->name)==0)break;		//cannot be friend with yourself
					memset(sendbuf,0,sizeof(sendbuf));
					strcpy(sendbuf,"$");
					strcat(sendbuf,usr->name);
					pthread_mutex_lock(&lock);
					user *q=head;
					while(q!=NULL){
						if(strcmp(q->name,temp)==0)			//find this gay
						{
							printf("$$$$sendbuf:%s\n",sendbuf);
							int i=0;
							int flag=1;
							for(;i<LISTENQ;i++)
							{
								if(usr->fri[i]==q)flag=0;
							}
							if(flag)
								stcp_server_send(q->sock,sendbuf,MAXLINE);
							break;
						}
						q=q->next;
					}
					pthread_mutex_unlock(&lock);

				}
				else if(sendbuf[0]=='y'||sendbuf[0]=='n'){   //yes or no  be friends
					strcpy(temp,&sendbuf[1]);
					if(sendbuf[0]=='y')
					{
						memset(sendbuf,0,sizeof(sendbuf));
						strcpy(sendbuf,"y");
						strcat(sendbuf,usr->name);
					}
					else
					{
						memset(sendbuf,0,sizeof(sendbuf));
						strcpy(sendbuf,"n");
						strcat(sendbuf,usr->name);

					}
					pthread_mutex_lock(&lock);
					user *q=head;
					while(q!=NULL){
						if(strcmp(q->name,temp)==0)			//find this gay
						{
							printf("y/n temp:%s\n",temp);
							if(sendbuf[0]=='y')
							{
								q->fri[q->fcount]=usr;
								q->fcount=(q->fcount+1)%LISTENQ;
								usr->fri[usr->fcount]=q;
								usr->fcount=(usr->fcount+1)%LISTENQ;
							}
							stcp_server_send(q->sock,sendbuf,MAXLINE);
							printf("y/n sendbuf:%s\n",sendbuf);
							break;
						}
						q=q->next;
					}
					pthread_mutex_unlock(&lock);

				}
				else if(sendbuf[0]=='!')
				{
					printf("1!!!sendbuf: %s\n",sendbuf);
					memset(sendbuf,0,sizeof(sendbuf));
					pthread_mutex_lock(&lock);
					int i=0;
					for(;i<LISTENQ;i++)
					{
						if(usr->fri[i]!=NULL)
						{
							strcat(sendbuf,"!");
							strcat(sendbuf,usr->fri[i]->name);
							strcat(sendbuf," || ");
						}
					}
					printf("!!!sendbuf: %s\n",sendbuf);
					pthread_mutex_unlock(&lock);
					stcp_server_send(usr->sock,sendbuf,MAXLINE);
					break;
				}
				else if(sendbuf[0]=='4')		//user quit
				{
					while(1){	//wait for all user get the old msg 
						//then update
						pthread_mutex_lock(&lock);
						if(count>0)
						{
							pthread_mutex_unlock(&lock);
							sleep(1);
						}
						else
							break;
					}
					userCount--;
					pthread_mutex_lock(&(usr->usrlock));
					usr->state=4;
					pthread_mutex_unlock(&(usr->usrlock));
					count=userCount;
					msgid=usr->id;
					strcpy(msgbuf,"@@@@@ ");
					strcat(msgbuf,usr->name);
					strcat(msgbuf," out of room @@@@\n");
					pthread_cond_broadcast(&has_message);
					pthread_mutex_unlock(&lock);
					return NULL;	
				}
				break;

		}
	}
}