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); }
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); }
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); }
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); }
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); }
/*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; } } }