1. 程式人生 > >封包傳送資料包

封包傳送資料包

伺服器:

#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);
	}

}