2008年10月15日星期三

Linux Socket编程实例(一个Hello World程序)





/*
*

?*?Tcp?Server?program,?It?is?a?simple?example?only.

?*?zhengsh?200520602061?2

?*?when?client?connect?to?server,?send?a?welcome?message?and?timestamp?in?server.

?

*/







?

#include?

<
stdio.h
>






#include?

<
sys
/
socket.h
>






#include?

<
unistd.h
>






#include?

<
sys
/
types.h
>






#include?

<
netinet
/
in
.h
>






#include?

<
stdlib.h
>






#include?

<
time.h
>






?


#define
?SERVER_PORT?20000?
//
?define?the?defualt?connect?port?id








#define
?LENGTH_OF_LISTEN_QUEUE?10?
//
length?of?listen?queue?in?server








#define
?BUFFER_SIZE?255








#define
?WELCOME_MESSAGE?"welcome?to?connect?the?server.?"






?

?


int
?main(
int
?argc,?
char
?
**
argv)




{

???????

int
?servfd,clifd;

???????

struct
?sockaddr_in?servaddr,cliaddr;

?

???????

if
?((servfd?
=
?socket(AF_INET,SOCK_STREAM,
0
))?
<
?
0
)

???????



{

??????????????printf(

"
create?socket?error!\n
"
);

??????????????exit(

1
);

???????}








???????bzero(

&
servaddr,
sizeof
(servaddr));

???????servaddr.sin_family?

=
?AF_INET;

???????servaddr.sin_port?

=
?htons(SERVER_PORT);

???????servaddr.sin_addr.s_addr?

=
?htons(INADDR_ANY);

?

???????

if
?(bind(servfd,(
struct
?sockaddr
*
)
&
servaddr,
sizeof
(servaddr))
<
0
)

???????



{

??????????????printf(

"
bind?to?port?%d?failure!\n
"
,SERVER_PORT);

??????????????exit(

1
);

???????}








?

???????

if
?(listen(servfd,LENGTH_OF_LISTEN_QUEUE)?
<
?
0
)

???????



{

??????????????printf(

"
call?listen?failure!\n
"
);

??????????????exit(

1
);

???????}








?

???????

while
?(
1
)

???????



{
//
server?loop?will?nerver?exit?unless?any?body?kill?the?process








??????????????

char
?buf[BUFFER_SIZE];

??????????????

long
?timestamp;

??????????????socklen_t?length?

=
?
sizeof
(cliaddr);

??????????????clifd?

=
?accept(servfd,(
struct
?sockaddr
*
)
&
cliaddr,
&
length);

??????????????

if
?(clifd?
<
?
0
)

??????????????



{

?????????????????????printf(

"
error?comes?when?call?accept!\n
"
);

?????????????????????

break
;

??????????????}








??????????????strcpy(buf,WELCOME_MESSAGE);

??????????????

//
inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);








??????????????

??????????????printf(

"
from?client,IP:%s,Port:%d\n
"
,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));

??????????????timestamp?

=
?time(NULL);

??????????????strcat(buf,

"
timestamp?in?server:
"
);

??????????????strcat(buf,ctime(

&
timestamp));

??????????????send(clifd,buf,BUFFER_SIZE,

0
);

??????????????close(clifd);???????????

??????????????

???????}


//
exit








???????close(servfd);

???????

return
?
0
;

}








?

?客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息

,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.





/*
?Tcp?client?program,?It?is?a?simple?example?only.

?*?zhengsh?200520602061?2

?*?connect?to?server,?and?echo?a?message?from?server.

?

*/







?

?

#include?

<
stdio.h
>






#include?

<
sys
/
socket.h
>






#include?

<
unistd.h
>






#include?

<
sys
/
types.h
>






#include?

<
netinet
/
in
.h
>






#include?

<
stdlib.h
>






?


#define
?SERVER_PORT?20000?
//
?define?the?defualt?connect?port?id








#define
?CLIENT_PORT?((20001+rand())%65536)?
//
?define?the?defualt?client?port?as?a?random?port






?


#define
?BUFFER_SIZE?255








#define
?REUQEST_MESSAGE?"welcome?to?connect?the?server.\n"






?


void
?usage(
char
?
*
name)




{

???????printf(

"
usage:?%s?IpAddr\n
"
,name);

}








?


int
?main(
int
?argc,?
char
?
**
argv)




{?????

???????

int
?servfd,clifd,length?
=
?
0
;

???????

struct
?sockaddr_in?servaddr,cliaddr;

???????socklen_t?socklen?

=
?
sizeof
(servaddr);

???????

char
?buf[BUFFER_SIZE];

???????

???????

if
?(argc?
<
?
2
)

???????



{

??????????????usage(argv[

0
]);

??????????????exit(

1
);

???????}








???????

???????

if
?((clifd?
=
?socket(AF_INET,SOCK_STREAM,
0
))?
<
?
0
)

???????



{

??????????????printf(

"
create?socket?error!\n
"
);

??????????????exit(

1
);

???????}








???????srand(time(NULL));

//
initialize?random?generator








???????bzero(

&
cliaddr,
sizeof
(cliaddr));

???????cliaddr.sin_family?

=
?AF_INET;

???????cliaddr.sin_port?

=
?htons(CLIENT_PORT);

???????cliaddr.sin_addr.s_addr?

=
?htons(INADDR_ANY);

?

???????bzero(

&
servaddr,
sizeof
(servaddr));

???????servaddr.sin_family?

=
?AF_INET;

???????inet_aton(argv[

1
],
&
servaddr.sin_addr);

???????servaddr.sin_port?

=
?htons(SERVER_PORT);

???????

//
servaddr.sin_addr.s_addr?=?htons(INADDR_ANY);








?

???????

if
?(bind(clifd,(
struct
?sockaddr
*
)
&
cliaddr,
sizeof
(cliaddr))
<
0
)

???????



{

??????????????printf(

"
bind?to?port?%d?failure!\n
"
,CLIENT_PORT);

??????????????exit(

1
);

???????}








?

???????

if
?(connect(clifd,(
struct
?sockaddr
*
)
&
servaddr,?socklen)?
<
?
0
)

???????



{

??????????????printf(

"
can't?connect?to?%s!\n
"
,argv[
1
]);

??????????????exit(

1
);

???????}








???????

???????length?

=
?recv(clifd,buf,BUFFER_SIZE,
0
);

???????

if
?(length?
<
?
0
)

???????



{

??????????????printf(

"
error?comes?when?recieve?data?from?server?%s!
"
,argv[
1
]);

??????????????exit(

1
);

???????}








???????printf(

"
from?server?%s?:\n\t%s?
"
,argv[
1
],buf);

?

???????close(clifd);

???????

return
?
0
;

}











--------------------next---------------------

0 条评论:

发表评论

订阅 博文评论 [Atom]

<< 主页