免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 779 | 回复: 0

网络编程TCP/UDP [复制链接]

论坛徽章:
0
发表于 2009-03-16 17:02 |显示全部楼层
这几天学习了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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP