副标题[/!--empirenews.page--]
"IP地址+端口号" 就称为 socket。本文以一个简单的 TCP 协议为例,介绍如何创建基于 TCP 协议的网络程序。



#include <.h>
<span style="color: #0000ff">#define MAXLINE 80
<span style="color: #0000ff">#define SERV_PORT 8000
<span style="color: #0000ff">int main(<span style="color: #0000ff">void<span style="color: #000000">)
{
<span style="color: #0000ff">struct<span style="color: #000000"> sockaddr_in servaddr,cliaddr;
socklen_t cliaddr_len;
<span style="color: #0000ff">int<span style="color: #000000"> listenfd,connfd;
<span style="color: #0000ff">char<span style="color: #000000"> buf[MAXLINE];
<span style="color: #0000ff">char<span style="color: #000000"> str[INET_ADDRSTRLEN];
<span style="color: #0000ff">int<span style="color: #000000"> i,n;
</span><span style="color: #008000">//</span><span style="color: #008000"> socket() 打开一个网络通讯端口,如果成功的话,
</span><span style="color: #008000">//</span><span style="color: #008000"> 就像 open() 一样返回一个文件描述符,
</span><span style="color: #008000">//</span><span style="color: #008000"> 应用程序可以像读写文件一样用 read/write 在网络上收发数据。</span>
listenfd = socket(AF_INET,SOCK_STREAM,<span style="color: #800080">0</span><span style="color: #000000">);
bzero(</span>&servaddr,<span style="color: #0000ff">sizeof</span><span style="color: #000000">(servaddr));
servaddr.sin_family </span>=<span style="color: #000000"> AF_INET;
servaddr.sin_addr.s_addr </span>=<span style="color: #000000"> htonl(INADDR_ANY);
servaddr.sin_port </span>=<span style="color: #000000"> htons(SERV_PORT);
</span><span style="color: #008000">//</span><span style="color: #008000"> bind() 的作用是将参数 listenfd 和 servaddr 绑定在一起,
</span><span style="color: #008000">//</span><span style="color: #008000"> 使 listenfd 这个用于网络通讯的文件描述符监听 servaddr 所描述的地址和端口号。</span>
bind(listenfd,(<span style="color: #0000ff">struct</span> sockaddr *)&servaddr,<span style="color: #0000ff">sizeof</span><span style="color: #000000">(servaddr));
</span><span style="color: #008000">//</span><span style="color: #008000"> listen() 声明 listenfd 处于监听状态,
</span><span style="color: #008000">//</span><span style="color: #008000"> 并且最多允许有 20 个客户端处于连接待状态,如果接收到更多的连接请求就忽略。</span>
listen(listenfd,<span style="color: #800080">20</span><span style="color: #000000">);
printf(</span><span style="color: #800000">"</span><span style="color: #800000">Accepting connections ...n</span><span style="color: #800000">"</span><span style="color: #000000">);
</span><span style="color: #0000ff">while</span> (<span style="color: #800080">1</span><span style="color: #000000">)
{
cliaddr_len </span>= <span style="color: #0000ff">sizeof</span><span style="color: #000000">(cliaddr);
</span><span style="color: #008000">//</span><span style="color: #008000"> 典型的服务器程序可以同时服务于多个客户端,
</span><span style="color: #008000">//</span><span style="color: #008000"> 当有客户端发起连接时,服务器调用的 accept() 返回并接受这个连接,
</span><span style="color: #008000">//</span><span style="color: #008000"> 如果有大量的客户端发起连接而服务器来不及处理,尚未 accept 的客户端就处于连接等待状态。</span>
connfd = accept(listenfd,(<span style="color: #0000ff">struct</span> sockaddr *)&cliaddr,&<span style="color: #000000">cliaddr_len);
n </span>=<span style="color: #000000"> read(connfd,buf,MAXLINE);
printf(</span><span style="color: #800000">"</span><span style="color: #800000">received from %s at PORT %dn</span><span style="color: #800000">"</span><span style="color: #000000">,inet_ntop(AF_INET,</span>&cliaddr.sin_addr,str,<span style="color: #0000ff">sizeof</span><span style="color: #000000">(str)),ntohs(cliaddr.sin_port));
</span><span style="color: #0000ff">for</span> (i = <span style="color: #800080">0</span>; i < n; i++<span style="color: #000000">)
{
buf[i] </span>=<span style="color: #000000"> toupper(buf[i]);
}
write(connfd,n);
close(connfd);
}
}
$ server.c -o server
$ ./server

socket( family, type, protocol);
bind( sockfd, sockaddr *myaddr,socklen_t addrlen);
bzero(&servaddr,=== htons(SERV_PORT);
listen( sockfd, backlog);
accept( sockfd, sockaddr *cliaddr,socklen_t *addrlen);
(= = sockaddr *)&cliaddr,&=
#include <.h>
<span style="color: #0000ff">#define MAXLINE 80
<span style="color: #0000ff">#define SERV_PORT 8000
(编辑:瑞安网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|