Chinaunix首页 | 论坛 | 博客
  • 博客访问: 243117
  • 博文数量: 55
  • 博客积分: 2160
  • 博客等级: 大尉
  • 技术积分: 598
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-08 14:36
文章分类

全部博文(55)

文章存档

2013年(1)

2012年(5)

2010年(49)

我的朋友

分类: LINUX

2010-05-07 15:05:02

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
/* 服务器要监听的本地端口 */
#define MYPORT 4000
/* 能够同时接受多少没有 accept 的连接 */
#define BACKLOG 10
void
sig_urg(int signo);
main()
{
     /* 在 sock_fd 上进行监听,new_fd 接受新的连接 */
     int sock_fd, new_fd ;
        /* 用于存储以前系统缺省的 SIGURL 处理器的变量 */ void * old_sig_urg_handle ;
     /* 自己的地址信息 */
     struct sockaddr_in my_addr;
     /* 连接者的地址信息*/
     struct sockaddr_in their_addr;
     int sin_size;
     int n ;
     char buff[100] ;
        /* 这里就是我们一直强调的错误检查.如果调用 socket() 出错,则返回 */
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
     {

     /* 输出错误提示并退出 */
     perror(“ socket” );
     exit(1);
     }
     /* 主机字节顺序 */
     my_addr.sin_family = AF_INET;
     /* 网络字节顺序,短整型 */
     my_addr.sin_port = htons(MYPORT);
     /* 将运行程序机器的 IP 填充入 s_addr */
     my_addr.sin_addr.s_addr = INADDR_ANY;
     /* 将此结构的其余空间清零 */
     bzero(&(my_addr.sin_zero), 8);
     /* 这里是我们一直强调的错误检查! */

if (bind(sockfd, (struct sockaddr *)&my_addr,
                                         !
     sizeof(struct sockaddr)) == -1)
     {
     /* 如果调用 bind()失败,则给出错误提示,退出 */
     perror(“ bind” );
     exit(1);
     }
     /* 这里是我们一直强调的错误检查! */ !
     if (listen(sockfd, BACKLOG) == -1)
     {
     /* 如果调用 listen 失败,则给出错误提示,退出 */
     perror(“ listen”);
     exit(1);
     }
     /* 设置 SIGURG 的处理函数 sig_urg */
     old_sig_urg_handle = signal(SIGURG, sig_urg);
     /* 更改 connfd 的属主 */
     fcntl(sockfd, F_SETOWN, getpid());
     while(1)
     {

     /* 这里是主 accept()循环 */
     sin_size = sizeof(struct sockaddr_in);
        /* 这里是我们一直强调的错误检查! */ !
        if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
            {
        /* 如果调用 accept()出现错误,则给出错误提示,进入下一个循环 */
     perror(“ accept” );
     continue;
            }
     /* 服务器给出出现连接的信息 */
     printf(“ server: got connection from %s\n” inet_ntoa(their_addr.sin_addr));
                                                  ,
/* 这里将建立一个子进程来和刚刚建立的套接字进行通讯 */
     if (!fork())
     /* 这里是子进程 */
     while(1)
                 {
        if((n = recv(new_fd, buff, sizeof(buff)– 1)) == 0)
                      {
                                 );
     printf(“ received EOF\n”
     break ;
                      }
     buff[n] = 0 ;
     printf(Recv %d bytes: %s\n” n, buff);
                                       ,
                 }
     /* 关闭 new_fd 代表的这个套接字连接 */
     close(new_fd);
            }
     }
     /* 等待所有的子进程都退出 */
     while(waitpid(-1,NULL,WNOHANG) > 0);
     /* 恢复系统以前对 SIGURG 的处理器 */
     signal(SIGURG, old_sig_urg_handle);
}
void
sig_urg(int signo)
{

     int n;
     char buff[100] ;
                                  );
     printf(“ SIGURG received\n”
     n = recv(new_fd, buff, sizeof(buff)–1, MSG_OOB);
     buff [ n ] = 0 ;
     printf(recv %d OOB byte: %s\n”, n, buff);
}

 

/*客户端程序*/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
/* 服务器程序监听的端口号 */
#define PORT 4000
/* 我们一次所能够接收的最大字节数 */
#define MAXDATASIZE 100
int
main(int argc, char *argv[])
{
     /* 套接字描述符 */
     int sockfd, numbytes;
     char buf[MAXDATASIZE];
     struct hostent *he;
     /* 连接者的主机信息 */
     struct sockaddr_in their_addr;
     /* 检查参数信息 */
     if (argc != 2)
     {
    /* 如果没有参数,则给出使用方法后退出 */
    fprintf(stderr,“ usage: client hostname\n” );
    exit(1);
    }
    /* 取得主机信息 */
    if ((he=gethostbyname(argv[1])) == NULL)
    /* 如果 gethostbyname()发生错误,则显示错误信息并退出 */
          herror(“ gethostbyname” );
          exit(1);
    }
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    /* 如果 socket()调用出现错误则显示错误信息并退出 */
    perror(“ socket” );
    exit(1);
    }
    /* 主机字节顺序 */
    their_addr.sin_family = AF_INET;
    /* 网络字节顺序,短整型 */
    their_addr.sin_port = htons(PORT);
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    /* 将结构剩下的部分清零*/
    bzero(&(their_addr.sin_zero), 8);
    if(connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
    {
    /* 如果 connect()建立连接错误,则显示出错误信息,退出 */
    perror(“ connect” );
    exit(1);
    }
    /* 这里就是我们说的错误检查! */
    if (send(new_fd, “ 123” 3, 0) == -1)
    {
/* 如果错误,则给出错误提示,然后关闭这个新连接,退出 */
    perror(“ send” );
    close(new_fd);

      exit(0);
      }
                                        );
printf(Send 3 byte of normal data\n”
      /* 睡眠 1 秒 */
      sleep(1);
         if (send(new_fd,, 1, MSG_OOB)== -1)
      {
      perror(“ send”);
      close(new_fd);
      exit(0);
      }
                                           );
      printf(Send 1 byte of OOB data\n”
      sleep(1);
         if (send(new_fd,, 2, 0) == -1)
      {
      perror(“ send”);
      close(new_fd);
      exit(0);
      }
                                        
printf(Send 2 bytes of normal data\n”
);
sleep(1);
if (send(new_fd,, 1, MSG_OOB)== -1)
      {
      perror(“ send”);
      close(new_fd);
      exit(0);
      }
                                     
printf(Send 1 byte of OOB data\n”
);
sleep(1);
if (send(new_fd,, 2, MSG_OOB)== -1)
      {
      perror(“ send”);
      close(new_fd);
      exit(0);
      }
                                            
      printf(Send 2 bytes of normal data\n”
 );
      sleep(1);

  close(sockfd);
  return 0;
}

阅读(972) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~