本文编的是echo服务器示例程序,当收到客户端的数据,服务器把数据不经加工地发送给客户。采用TCP连接,采用端口8080进行设计,在整个过程中主要涉及socket的通信。
首先建立一个 socket,代码如下:
int socketfd;
socketfd = socket(AF_INET, SOCK_STREAM, 0);
socket函数是我们写socket程序遇到的第一个函数,它在指定的协议上创建一个socket,它的函数说明如下所示:
#include
int socket ( int AddressFamily, int Type, int Protocol)
其中:AddressFamily参数指定socket操作中所要解释的网络地址类型,值为如下之一:
AF_UNIX
表示操作系统文件路径
AF_INET
表示Internet网络地址
AF_NS
表示XEROX网络地址
Type参数表明了通信的语义,即通信连接的方式。参数为如下之一:
SOCK_STREAM
提供稳定可靠的连接,并且是双向的通信方式,如TCP。
SOCK_DGRAM
提供无连接的数据报通信,如UDP。
SOCK_RAW
提供该问内部网络协议和网络接口, 只有root用户才可以使用些协议。
返回值:成功则返socket描述符,出错则返回-1,可通过errno代码进行查看错误原因。
再次,把socket绑定到本机上,代码如下:
struct sockaddr_in sa;
bzero(&sa, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(EHCO_PORT);
sa.sin_addr.s_addr = htons(INADDR_ANY);
bzero(&(sa.sin_zero), 8);
if(bind(socketfd, (struct sockaddr *)&sa, sizeof(sa))!= 0)
{
printf("bind failed ");
printf("errno=%d ", errno);
exit(1);
}
else
{
printf("bind successfully ");
}
|
上面的代码中,定义一个scokaddr_in 结构体变量sa,然后填机服务所要开通的端口号和地址。
sa.sin_family = AF_INET;
>表明地址类型
sa.sin_port = htons(EHCO_PORT);
>端口号为8080
sa.sin_addr.s_addr = htons(INADDR_ANY);
>表明绑定在本机
然后利用bind函数,把刚才已建立的socket作为参数,绑定起来。
绑定完成后,服务器要侦听客户端的连接,因此首先要完成侦听设置这一过程,由listen函数实现,代码如下:
if(listen(socketfd ,MAX_CLIENT_NUM) != 0)
...{
printf("listen error ");
exit(1);
}
else
...{
printf("listen successfully ");
}
|
listen(socketfd, MAX_CLIENT_NUM)表明在socketfd上侦听,其中客户个数最大值为MAX_CLIENT_NUM。
共4页: 上一页 1 [2] [3] [4] 下一页 |