步骤:
1.创建TCP套接字
int listenfd;
listenfd = Socket(AF_INET,SOCK_STREAM,0);
关于socket的函数介绍:点击打开链接
第一个参数是协议族,具体在上面的链接有介绍,这里是一个ipv4的协议族。
第二个参数是协议类型,这里是一个tcp协议。
第三个参数是用于制定某个协议的特定类型,通常某个协议只有一种特定类型,这样这个参数只能设置为0,但是有些协议有多种,就需要设定这个参数。2
2.填写一个网际套接字地址结构
struct sockaddr_in servaddr;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(13);
关于套接字地址结构:点击打开链接
先清零,然后设置套接字数据结构,关于htonl与htons的知识:点击打开链接
时间获取服务器端口为13.
以及指定IP地址为INADDR_ANY,可以在任意网络上接收客户链接。
3.绑定套接字结构。
Bind(listenfd,(SA*) &servaddr,sizeof(servaddr));
关于绑定函数的介绍:
点击打开链接
4.通过listen函数把该套接字转换成一个监听套接字
Listen(listenfd,LISTENQ);
listen函数:点击打开链接
5.进行无限循环来监听。
for( ; ;)
{
connfd=Accept(listenfd,(SA*)NULL,NULL);
ticks=tima(NULL);
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
Write(connfd,buff,strlen(buff));
Close(connfd);
}
服务器进程在accept调用中被投入睡眠,等待三次握手来建立连接,握手完毕返回,accept返回一个已连接描述符,为connfd
用于与客户端通信。
6.代码取自《UNIX网络编程第一卷》其中的一些小点:头文件是书作者自己编写的一个unp.h,里面有将大部分的函数再包装一遍
例如其中的Socket:
int
Socket(int family,int type,int protocol)
{
int n;
if((n=socket(family,type,protocol))<0)
err_sys("socket error");
return n;
}
以及其中的err_sys也是作者自己写的return error的一个头文件。
7.整体代码:
#include "unp.h"
#include <time.h>
#include "myere.h"
int
main(int argc,char **argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd=Socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(13);
Bind(listenfd,(SA*) &servaddr,sizeof(servaddr));
Listen(listenfd,LISTENQ);
for(; ; )
{
connfd=Accept(listenfd,(SA*) NULL,NULL);
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
Write(connfd,buff,strlen(buff));
Close(connfd);
}
}
8.验证: