- 论坛徽章:
- 0
|
这几天学习了TCP和UDP的编程。
记下程序。
TCP SERVER:1.创建SOCKET ->2.绑定SOCKET->3.侦听SOCKET->如果发现有链接,则可创建子进程去处理。(子进程中注意要CLOSE掉父进程中的SOCKET)。下面是简单的网络SHELL,草稿,未整理,只实现基本功能,因为重点在网络编程。
#include
#include
#include
#include
#include
int read_line(int fd,char *buf,size_t size);
int main(int argc, char **argv)
{
int socketfd;
struct sockaddr_in sevaddr;
int port=8000;
if(argc==2)
{
port = atoi(argv[1]);
}
socketfd = socket(AF_INET,SOCK_STREAM,0);
sevaddr.sin_port = htons(port);
sevaddr.sin_addr.s_addr = INADDR_ANY;
sevaddr.sin_family = AF_INET;
if(bind(socketfd,(struct sockaddr*)&sevaddr,sizeof(struct sockaddr))==-1)
{
perror("bind error!\n");
exit(1);
}
if(listen(socketfd,1)==-1)
{
perror("listen error!\n");
exit(1);
}
while(1)
{
struct sockaddr_in cliaddr;
char ip[80];
pid_t pid;
int confd;
int length = sizeof(struct sockaddr);
confd = accept(socketfd, (struct sockaddr*)&cliaddr,&length);
printf("connect with :%s",(char*)inet_ntop(AF_INET,&cliaddr.sin_addr.s_addr,ip,80));
pid=fork();
if(!pid)
{ char recvbuf[2048];
memset(recvbuf,0,2048);
size_t recvlen;
while((recvlen=read_line(confd,recvbuf,2048))>0)
{
int i=0;
pid_t pid1;
char *arg[5]={NULL};
recvbuf[recvlen-2]='\0';
arg[0] = strtok(recvbuf," ");
while(arg)
{
printf("%s\n",arg);
i++;
arg = strtok(NULL," ");
}
pid1 = fork();
if(!pid1)
{
dup2(confd,1);
execvp(arg[0],&arg[0]);
exit(0);
}
}
exit(0);
printf("disconnect !\n");
}
close(confd);
}
close(socketfd);
}
int read_line(int fd,char *buf,size_t size)
{
int recvlen,offset=0;
while((recvlen = recv(fd,buf+offset,size-offset,0))>0)
{
if((strchr(buf,'\n')!=NULL)||(strchr(buf,'\r')!=NULL))break;
if(recvlen == (size - offset))
break;
offset += recvlen;
}
if(recvlen
下面是WEB服务器,基于HTTP1.1。
#include
#include
#include
#include
#include
#include
#include
void str_deal(int fd,char *buf);
int main(int argc, char **argv)
{
int socketfd;
struct sockaddr_in sevaddr;
int port=80;
socketfd = socket(AF_INET,SOCK_STREAM,0);
sevaddr.sin_port = htons(port);
sevaddr.sin_addr.s_addr=INADDR_ANY;
sevaddr.sin_family = AF_INET;
if(bind(socketfd,(struct sockaddr*)&sevaddr,sizeof(struct sockaddr))==-1)
{
perror("bind!\n");
exit(1);
}
if(listen(socketfd,1)==-1)
{
perror("listen!\n");
exit(1);
}
printf("server is running!\n");
while(1)
{
int status;
struct sockaddr_in cliaddr;
char buf[500];
char IP[30];
int length = sizeof(struct sockaddr);
pid_t pid;
int confd=accept(socketfd,(struct sockaddr*)&cliaddr,&length);
printf("connect %s\n",(char*)inet_ntop(AF_INET,(char*)&(cliaddr.sin_addr.s_addr),IP,30));
if(length==-1)
{
perror("accept error!\n");
exit(2);
}
if(recv(confd,(char*)buf,500,0)==-1)
{
perror("recv error!\n");
exit(2);
}
else
{
pid=fork();
if(!pid)
{
close(socketfd);
printf("%d\n",confd);
str_deal(confd ,buf);
exit(0);
}
// wait(&status);
}
close(confd);
}
close(socketfd);
}
void str_deal(int fd, char *buf)
{
char *buf_after[5]={NULL};
int fdhtml;
char a[] = "command error!";
char b[] = "HTTP/1.1 404 NOTFound! ";
char d[50] = "/home/LFS-6.2";
int i = 0;
if(strncmp(buf,"GET",3)!=0)
{
write(fd,a,sizeof(a));
exit(1);
}
buf_after[0]=strtok(buf," ");
while(buf_after)
{
i++;
buf_after=strtok(NULL," ");
if(i>3)break;
}
strcat(d,buf_after[1]);
printf("%s\n",d);
if((fdhtml=open(d,O_RDONLY))==-1)
{
write(fd,b,sizeof(b));
exit(1);
}
else
{
char mybuf[10000];
char c[]="HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n";
int length;
write(fd,c,sizeof(c));
while((length=read(fdhtml,mybuf,10000))>0)
{
printf("read successful!%d\n",length);
write(fd,mybuf,length);
memset(mybuf,'\0',10000);
}
}
}
下面是基于UDP的TFTP的客户端,和服务器端,写得很烂,怕忘记,记下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char **argv)
{
int sd,i=0,length,fd;
size_t lenaddr=sizeof(struct sockaddr);
struct sockaddr_in cliaddr,sevaddr;
char typ[]="octet";
char buf[516];
fd_set readfds;
struct timeval tv;
if(argc != 5)
{
perror("argument error!\n");
exit(1);
}
memset(buf,0,516);
buf[0] =0x00;
buf[1] =0x01;
memcpy((char*)(buf+2),argv[3],strlen(argv[3]));
buf[2+strlen(argv[3])]=0x00;
memcpy((char*)(buf+3+strlen(argv[3])),typ,sizeof(typ));
for(i=0;i
sd = socket(AF_INET,SOCK_DGRAM,0);
if(sd
exit(0);
}客户端
服务器端:只能执行简单功能,功能扩展中。
include
#include
#include
#include
#include
#include
#include
int main(void)
{
int socketfd;
struct sockaddr_in seraddr;
socketfd = socket(AF_INET,SOCK_DGRAM,0);
char buf[100];
int length = sizeof(struct sockaddr);
int port=69;
if(socketfd == -1)
{
perror("sock error!\n");
exit(1);
}
seraddr.sin_port = htons(port);
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = INADDR_ANY;
if(bind(socketfd, (struct sockaddr*)&seraddr, sizeof(struct sockaddr)) == -1)
{
perror("bind error!\n");
exit(1);
}
while(1)
{
struct sockaddr_in cliaddr;
if(recvfrom(socketfd,buf,100,0,(struct sockaddr*)&cliaddr,&length)>0)
{
pid_t pid;
//int INET_ADDRSTRLEN=80;
char cliIP[80];
pid = fork();
printf("client ip = %s:", inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, cliIP, 80));
if(!pid)
{
int clifd = socket(AF_INET,SOCK_DGRAM,0);
close(socketfd);
if(buf[1]==1)
{
char name[30];
int fd;
char read1[516];
int count=1;
size_t leng;
int i;
strcpy(name,buf+2);
if((fd = open(name,O_RDONLY))==-1)
{
perror("not found!\n");
exit(1);
}
memset(read1,0,516);
read1[1]=3;
read1[3]=1;
while((leng=read(fd,read1+4,512))==512)
{
for(i=0;i
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93422/showart_1865004.html |
|