Linux系统中BSD套接口开发的基础介绍(2)
2009-05-13 12:12:31来源:未知 阅读 ()
#include
#include /* socket(), bind(),
listen(), accept() */
#include
#include
#include
#include /* fork(), write(), close() */
/*
* constants
*/
const char MESSAGE[] = "Hello, World!\n";
const int BACK_LOG = 5;
/*
*程序需要一个命令行参数:需要绑定的端口号
*/
int main(int argc, char *argv[])
{
int serverSocket = 0,
on = 0,
port = 0,
status = 0,
childPid = 0;
struct hostent *hostPtr = NULL;
char hostname[80] = "";
struct sockaddr_in serverName = { 0 };
if (2 != argc)
{
fprintf(stderr, "Usage: %s \n",
argv[0]);
exit(1);
}
port = atoi(argv[1]);
/ *
*socket()系统调用,带有三个参数:
* 1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),
* PF_INET6(IPv6)等
* 2、type指明通信类型,最常用的如SOCK_STREAM(面向连接可靠方式,
* 比如TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如UDP)等。
* 3、参数protocol指定需要使用的协议。虽然可以对同一个协议
* 家族(protocol family)(或者说通信域(domain))指定不同的协议
* 参数,但是通常只有一个。对于TCP参数可指定为IPPROTO_TCP,对于
* UDP可以用IPPROTO_UDP。你不必显式制定这个参数,使用0则根据前
* 两个参数使用默认的协议。
*/
serverSocket = socket(PF_INET, SOCK_STREAM,
IPPROTO_TCP);
if (-1 == serverSocket)
{
perror("socket()");
exit(1);
}
/*
* 一旦套接口被建立,它的运作机制可以通过套接口选项(socket option)进行修改。
*/
/*
* SO_REUSEADDR选项的设置把套接口设置成重新使用旧的地址(IP地址加端口号)而不等待
* 注意:在Linux系统中,如果一个socket绑定了某个端口,该socket正常关闭或程序退出后,
* 在一段时间内该端口依然保持被绑定的状态,其他程序(或者重新启动 的原程序)无法绑定该端口。
*
* 下面的调用中:SOL_SOCKET代表对SOCKET层进行操作
*/
on = 1;
status = setsockopt(serverSocket, SOL_SOCKET,
SO_REUSEADDR,
(const char *) &on, sizeof(on));
if (-1 == status)
{
perror("setsockopt(...,SO_REUSEADDR,...)");
}
/* 当连接中断时,需要延迟关闭(linger)以保证所有数据都
* 被传输,所以需要打开SO_LINGER这个选项
* linger的结构在/usr/include/linux/socket.h中定义:
* struct linger
* {
* int l_onoff; /* Linger active */
* int l_linger; /* How long to linger */
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有