封包傳送資料包
阿新 • • 發佈:2018-12-21
伺服器:
#include"common.h" struct cli_t{ int num; int cfd; struct sockaddr_in caddr; struct cli_t *before; struct cli_t *next; }cli_t; struct cli_t *head = NULL; fd_set set; void *hander() { struct cli_t *hcli=NULL; while(1) { for(hcli = head;hcli!=NULL;hcli=hcli->next) { (hcli->num)++; int hfd=hcli->cfd; printf("[%d]->num==%d\n",hcli->cfd,hcli->num); if(hcli->num==20||hcli->num>20) { if(hcli->before==NULL) head=hcli->next; else hcli->before->next=hcli->next; printf("已退出\n"); FD_CLR(hfd,&set); } } sleep(1); } } int main() { int fd,nfd,maxfd; int ret; struct sockaddr_in saddr,caddr; int addr_len; char buf[1024]; int *pfd; fd_set rset; struct cli_t *pcli; fd = socket(AF_INET,SOCK_STREAM,0); if(fd<0) { perror("socket"); return -1; } saddr.sin_family = AF_INET; saddr.sin_port = htons(9090); inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr); ret = bind(fd,(struct sockaddr*)&saddr,sizeof(saddr)); if(ret<0) { perror("bind"); goto END; } ret = listen(fd,20); if(ret<0) { perror("listen"); goto END; } FD_ZERO(&set); FD_SET(fd,&set); maxfd = fd; struct timeval tv; tv.tv_sec=5; tv.tv_usec=0; pthread_t pthid; int ret2; ret2=pthread_create(&pthid,NULL,hander,(void*)head); if(ret2!=0) perror("pthread"); while(1) { rset = set; printf("select ...\n"); ret = select(maxfd+1,&rset,NULL,NULL,&tv); tv.tv_sec=5; printf("select over ret = %d\n",ret); if(ret<0) { perror("select"); break; } if(FD_ISSET(fd,&rset)) { //接受連結 addr_len = sizeof(caddr); printf("accept..\n"); nfd = accept(fd,(struct sockaddr*)&caddr,&addr_len); printf("accept over..\n"); if(nfd<0) { perror("accept"); } //加入集合 FD_SET(nfd,&set); if(nfd>maxfd) maxfd = nfd; //加入連結串列 pcli = malloc(sizeof(struct cli_t)); pcli->next=head; pcli->before=NULL; pcli->cfd = nfd; pcli->caddr = caddr; if(head!=NULL) head->before=pcli; head = pcli; } for(pcli = head;pcli!=NULL;pcli=pcli->next) { int tfd = pcli->cfd; if(!FD_ISSET(tfd,&rset)) continue; char buf[201]; memset(buf,0,201); char *level; ret = read(tfd,buf,201); if(ret <= 0) //埠斷開,使用者下線 { FD_CLR(tfd,&set); //取消檢測此客戶端 } else if(ret>0) { pcli->num=0; level=(char*)buf; printf("level==%c\n",*level); if(strcmp(buf,"send")==0) printf("資料已傳輸成功\n"); else if(strcmp(buf,"receive")==0) printf("資料接收成功\n"); else printf("buf==%s\n",buf); } } } END: close(fd); return 0; }
客戶端:
#include"common.h" int main() { /*建立連線*/ int fd; int ret; struct sockaddr_in saddr; char *buf=(char*)malloc(201); char buf2[200]; char *temp; fd = socket(AF_INET,SOCK_STREAM,0); if(fd<0) { perror("socket"); return -1; } saddr.sin_family = AF_INET; saddr.sin_port = htons(9090); inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr); ret = connect(fd,(struct sockaddr*)&saddr,sizeof(saddr)); if(ret<0) { perror("connect");close(fd); return -1; } while(1) { char a='8'; *buf=a; scanf("%s",buf2);getchar(); temp=buf2; memcpy((buf+1),temp,200); write(fd,buf,201); } }