3.一个完整的程序
#include
#include
#include /*包含有htons等函数的头文件*/
#include
#include
void main()
{
int listenfd,clifd;
long pid;
struct sockaddr_in myaddr,cliaddr;
int ret;
int len;
listenfd=socket(AF_INET,SOCK_STREAM,0);
if (listenfd<0)
{
perror("socket error");
exit(-1);
}
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
myaddr.sin_port=htons(8888);
ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if (ret<0)
{
perror("bind error");
exit(-1);
}
listen(listenfd,10);
len=sizeof(struct sockaddr);
while(1)
{
clifd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
/*注意accept的第三个参数也是地址*/
if(clifd==-1)
{
perror("accept error");
continue;
}
printf("connect from %s %d\n",inet_ntoa(cliaddr.sin_addr.s_addr),
ntohs(cliaddr.sin_port));
switch(pid=fork())
{
case 0: /*子进程*/
close(listenfd);
;/*子进程进行其他的操作*/
close(clifd);
exit(0);
break;
case -1:
perror("fork error");
break;
default:/*父进程*/
close(clifd);
break;
}
}
}
|
4.程序说明
该程序的功能是监听8888端口的连接,对所有的对8888端口的连接显示出地址和对方的端口号该程序在sco unix下调试通过,在其他unix和linux平台请注意inet_ntoa,htons函数所应在的头文件的名称 同时该程序用到了并发的观点,因为accept,read,write均为阻塞(block)的函数,一旦进程block将不能处理其他请求,所以用主进程进行listen,由子进程进行负责对客户端传输数据.
你可以在同一台unix机器用telnet localhost 8888进行观察程序会输出connect from 127.0.0.1 xxxx (e129)
<<上一页
1
2
|