⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 271.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
    for (;;) {                          /* loop for phone calls */ <br>

      if ((t= get_connection(s)) < 0) { /* get a connection */ <br>

        if (errno == EINTR)             /* EINTR might happen on accept(), * <br>

/ <br>

          continue;                     /* try again */ <br>

        perror("accept");               /* bad */ <br>

        exit(1); <br>

      } <br>

      switch(fork()) {                  /* try to handle connection */ <br>

      case -1 :                         /* bad news.  scream and die */ <br>

        perror("fork"); <br>

        close(s); <br>

        close(t); <br>

        exit(1); <br>

      case 0 :                          /* we're the child, do something */ <br>

        do_something(t); <br>

        exit(0); <br>



      default :                         /* we're the parent so look for */ <br>

        close(t);                       /* another connection */ <br>

        continue; <br>

      } <br>

    } <br>

  } <br>

  /* as children die we should get catch their returns or else we get <br>

   * zombies, A Bad Thing.  fireman() catches falling children. <br>

   */ <br>

  void fireman() <br>

  { union wait wstatus; <br>

    while(wait3(&wstatus,WNOHANG,NULL) > 0) <br>

        ; <br>

  } <br>

  /* this is the function that plays with the socket.  it will be called <br>

   * after getting a connection. <br>

   */ <br>

  void do_something(s) <br>

  int s; <br>

  { <br>

    /* do your thing with the socket here <br>

        : <br>

        : <br>

        : <br>

     */ <br>

  } <br>

Dialing (or: How to call a socket) <br>

You now know how to create a socket that will accept incoming calls. So how <br>

do y <br>

u call it? As with <br>

the telephone, you must first have the phone before using it to call. You us <br>

e th <br>

 socket() function to do <br>

this, exactly as you establish a socket to listen to. <br>

After getting a socket to make the call with, and giving it an address, you <br>

use <br>

he connect() function <br>

to try to connect to a listening socket. The following function calls a part <br>

icul <br>

r port number on a <br>

particular host: <br>

  int call_socket(hostname, portnum) <br>

  char *hostname; <br>

  { struct sockaddr_in sa; <br>

    struct hostent     *hp; <br>



    int a, s; <br>

    if ((hp= gethostbyname(hostname)) == NULL) { /* do we know the host's */ <br>

  <br>

      errno= ECONNREFUSED;                       /* address? */ <br>

      return(-1);                                /* no */ <br>

    } <br>

    bzero(&sa,sizeof(sa)); <br>

    bcopy(hp->h_addr,(char *)&sa.sin_addr,hp->h_length); /* set address */ <br>

    sa.sin_family= hp->h_addrtype; <br>

    sa.sin_port= htons((u_short)portnum); <br>

    if ((s= socket(hp->h_addrtype,SOCK_STREAM,0)) < 0)   /* get socket */ <br>

      return(-1); <br>

    if (connect(s,&sa,sizeof sa) < 0) {                  /* connect */ <br>

      close(s); <br>

      return(-1); <br>

    } <br>

    return(s); <br>

  } <br>

This function returns a connected socket through which data can flow. <br>

Conversation (or: How to talk between sockets) <br>

Now that you have a connection between sockets you want to send data between <br>

 the <br>

 the <br>

. The read() <br>

and write() functions are used to do this, just as they are for normal files <br>

. Th <br>

re is only one major <br>

difference between socket reading and writing and file reading and writing: <br>

you <br>

on't usually get back <br>

the same number of characters that you asked for, so you usually loop until <br>

you <br>

ave read the number <br>

of characters that you want. A simple func- tion to read a given number of c <br>

hara <br>

ters into a buffer is: <br>

  int read_data(s,buf,n) <br>

  int  s;                /* connected socket */ <br>

  char *buf;             /* pointer to the buffer */ <br>

  int  n;                /* number of characters (bytes) we want */ <br>

  { int bcount,          /* counts bytes read */ <br>

        br;              /* bytes read this pass */ <br>

    bcount= 0; <br>

    br= 0; <br>

    while (bcount < n) {             /* loop until full buffer */ <br>



      if ((br= read(s,buf,n-bcount)) > 0) { <br>

        bcount += br;                /* increment byte counter */ <br>

        buf += br;                   /* move buffer ptr for next read */ <br>

      } <br>

      if (br < 0)                    /* signal an error to the caller */ <br>

        return(-1); <br>

    } <br>

    return(bcount); <br>

  } <br>

A very similar function should be used to write data; we leave that function <br>

 as <br>

n exercise to the <br>

reader. <br>

Hanging Up (or: What to do when you're done with a socket) <br>

Just as you hang up when you're through speaking to someone over the telepho <br>

ne, <br>

o must you close <br>

a connection between sockets. The normal close() function is used to close e <br>

ach <br>

nd of a socket <br>

connection. If one end of a socket is closed and the other tries to write to <br>

 its <br>

 its <br>

end, the write will return <br>

an error. <br>

Speaking The Language (or: Byte order is important) <br>

Now that you can talk between machines, you have to be careful what you say. <br>

 Man <br>

 machines use <br>

differing dialects, such as ASCII versus (yech) EBCDIC. More commonly there <br>

are <br>

yte-order <br>

problems. Unless you always pass text, you'll run up against the byte-order <br>

prob <br>

em. Luckily people <br>

have already figured out what to do about it. <br>

Once upon a time in the dark ages someone decided which byte ord- er was "ri <br>

ght" <br>

 Now there exist <br>

functions that convert one to the other if necessary. Some of these function <br>

s ar <br>

 htons() (host to <br>

network short integer), ntohs() (network to host short integer), htoni() (ho <br>

st t <br>

 network integer), <br>



ntohi() (network to host integer), htonl() (host to network long integer), a <br>

nd n <br>

ohl() (network to host <br>

long integer). Before sending an in- teger through a socket, you should firs <br>

t ma <br>

sage it with the <br>

htoni() function: <br>

  i= htoni(i); <br>

  write_data(s, &i, sizeof(i)); <br>

and after reading data you should convert it back with ntohi(): <br>

  read_data(s, &i, sizeof(i)); <br>

  i= ntohi(i); <br>

If you keep in the habit of using these functions you'll be less likely to g <br>

oof <br>

t up in those <br>

circumstances where it is neces- sary. <br>

The Future Is In Your Hands (or: What to do now) <br>

Using just what's been discussed here you should be able to build your own p <br>

rogr <br>

ms that <br>

communicate with sockets. As with all new things, however, it would be a goo <br>

d id <br>



a to look at what's <br>

al- ready been done. Many public domain programs exist which make use of the <br>

 soc <br>

et concept, and <br>

many books exist which go into much more depth than I have here. In addition <br>

 I'v <br>

 deliberately left <br>

out a lot of details such as what kinds of things can go wrong; the manual p <br>

ages <br>

for each of the <br>

functions should be con- sulted for this information. <br>

If you have further questions about sockets or this primer, please feel free <br>

 to <br>

sk me at email address <br>

jimf@saber.com <br>

http://www.ecst.csuchico.edu/~chafey/prog/sockets/sinfo2.html <br>

-- <br>

※ 来源:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.38.198.197] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="192.htm">上一层</a>][<a href="272.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -