作者:empty 出版社:empty |
Linux Socket编程实例(一个Hello World程序)
在Linux下写了个小的socket程序,分为客户端和服务器端,服务端开一个端口(2000),做为一个daemon,等待客户的连接请求.一旦有客户连接,服务器端打印出客户端的IP地址和端口,并且向服务器端发送欢迎信息和时间.下面是服务端的代码(tcpserver.c).由于这只是个简单的程序,所以只用了单线程实现!
Cpp代码
1./**
2. * Tcp Server program, It is a simple example only.
3. * zhengsh 200520602061 2
4. * when client connect to server, send a welcome message and timestamp in server.
5. */
6.
7.#include stdio.h>
8.#include sys/socket.h>
9.#include unistd.h>
10.#include sys/types.h>
11.#include netinet/in.h>
12.#include stdlib.h>
13.#include time.h>
14.
15.#define SERVER_PORT 20000 // define the defualt connect port id
16.#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
17.#define BUFFER_SIZE 255
18.#define WELCOME_MESSAGE welcome to connect the server.
19.
20.
21.int main(int argc, char **argv)
22.{
23. int servfd,clifd;
24. struct sockaddr_in servaddr,cliaddr;
25.
26. if ((servfd = socket(AF_INET,SOCK_STREAM,0)) 0)
27. {
28. printf( create socket error! n );
29. exit(1);
30. }
31. bzero(&servaddr,sizeof(servaddr));
32. servaddr.sin_family = AF_INET;
33. servaddr.sin_port = htons(SERVER_PORT);
34. servaddr.sin_addr.s_addr = htons(INADDR_ANY);
35.
36. if (bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) 0)
37. {
38. printf( bind to port %d failure! n ,SERVER_PORT);
39. exit(1);
40. }
41.
42. if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) 0)
43. {
44. printf( call listen failure! n );
45. exit(1);
46. }
47.
48. while (1)
49. {//server loop will nerver exit unless any body kill the process
50. char buf[BUFFER_SIZE];
51. long timestamp;
52. socklen_t length = sizeof(cliaddr);
53. clifd = accept(servfd,(struct sockaddr*)&cliaddr,&length);
54. if (clifd 0)
55. {
56. printf( error comes when call accept! n );
57. break;
58. }
59. strcpy(buf,WELCOME_MESSAGE);
60. //inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);
61.
62. printf( from client,IP:%s,Port:%d n ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
63. timestamp = time(NULL);
64. strcat(buf, timestamp in server: );
65. strcat(buf,ctime(×tamp));
66. send(clifd,buf,BUFFER_SIZE,0);
67. close(clifd);
68.
69. }//exit
70. close(servfd);
71. return 0;
72.}
客户每次用一个随机的端口连接服务器,并接收来自服务器的欢迎信息
,然后打印出来(tcpclient).运行的时候接受一个参数,也就是服务器的ip地址.
Cpp代码
1./* Tcp client program, It is a simple example only.
2. * zhengsh 200520602061 2
3. * connect to server, and echo a message from server.
4. */
5.
6.
7.#include stdio.h>
8.#include sys/socket.h>
9.#include unistd.h>
10.#include sys/types.h>
11.#include netinet/in.h>
12.#include stdlib.h>
13.
14.#define SERVER_PORT 20000 // define the defualt connect port id
15.#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port
16.
17.#define BUFFER_SIZE 255
18.#define REUQEST_MESSAGE welcome to connect the server. n
19.
20.void usage(char *name)
21.{
22. printf( usage: %s IpAddr n ,name);
23.}
24.
25.int main(int argc, char **argv)
26.{
27. int servfd,clifd,length = 0;
28. struct sockaddr_in servaddr,cliaddr;
29. socklen_t socklen = sizeof(servaddr);
30. char buf[BUFFER_SIZE];
31.
32. if (argc 2)
33. {
34. usage(argv[0]);
35. exit(1);
36. }
37.
38. if ((clifd = socket(AF_INET,SOCK_STREAM,0)) 0)
39. {
40. printf( create socket error! n );
41. exit(1);
42. }
43. srand(time(NULL));//initialize random generator
44. bzero(&cliaddr,sizeof(cliaddr));
45. cliaddr.sin_family = AF_INET;
46. cliaddr.sin_port = htons(CLIENT_PORT);
47. cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
48.
49. bzero(&servaddr,sizeof(servaddr));
50. servaddr.sin_family = AF_INET;
51. inet_aton(argv[1],&servaddr.sin_addr);
52. servaddr.sin_port = htons(SERVER_PORT);
53. //servaddr.sin_addr.s_addr = htons(INADDR_ANY);
54.
55. if (bind(clifd,(struct sockaddr*)&cliaddr,sizeof(cliaddr)) 0)
56. {
57. printf( bind to port %d failure! n ,CLIENT_PORT);
58. exit(1);
59. }
60.
61. if (connect(clifd,(struct sockaddr*)&servaddr, socklen) 0)
62. {
63. printf( can't connect to %s! n ,argv[1]);
64. exit(1);
65. }
66.
67. length = recv(clifd,buf,BUFFER_SIZE,0);
68. if (length 0)
69. {
70. printf( error comes when recieve data from server %s! ,argv[1]);
71. exit(1);
72. }
73. printf( from server %s : n t%s ,argv[1],buf);
74.
75. close(clifd);
76. return 0;
77.}
empty