Socket编程:之TCP案例

转载请加上博文引用:http://i.cnblogs.com/EditPosts.aspx?postid=5733248&update=1

服务端:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <errno.h>
 4 #include <string.h>
 5 #include <netdb.h>
 6 #include <time.h>
 7 #include <unistd.h>
 8 #include <sys/types.h>
 9 #include <sys/socket.h>
10 #include <arpa/inet.h>
11 
12 int sockfd;
13 
14 void do_service(int fd)
15 {
16     long t = time(0);
17     char *s = ctime(&t);
18     write(fd,s,strlen(s));
19 }
20 void out_client(struct sockaddr_in clientaddr)
21 {
22     char buffer[16];
23     inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,buffer,sizeof(clientaddr));
24     unsigned short port = ntohs(clientaddr.sin_port);
25     printf("client ip:%s (%d)\n",buffer,port);
26 }
27 
28 
29 int main(int argc,char *argv[])
30 {
31     if(argc < 2)
32     {
33         fprintf(stderr,"usage: %s port\n",argv[0]);
34         exit(1);
35     }
36 
37     //创建套接字
38     sockfd = socket(AF_INET,SOCK_STREAM,0);
39     if(sockfd < 0)
40     {
41         fprintf(stderr,"socket: %s\n",strerror(errno));
42         exit(1);
43     }
44 
45     //设置IP和端口
46     struct sockaddr_in addr;
47     memset(&addr,0,sizeof(addr));
48     addr.sin_family = AF_INET;
49     addr.sin_port = htons(atoi(argv[1]));
50     addr.sin_addr.s_addr = INADDR_ANY; 
51 
52     //绑定IP和端口
53     int len = sizeof(addr);
54     if(bind(sockfd,(struct sockaddr*)&addr,len) < 0)
55     {
56         fprintf(stderr,"bind: %s\n",strerror(errno));
57         exit(1);
58     }
59 
60     //开始听
61     if(listen(sockfd,10) < 0)
62     {
63         fprintf(stderr,"listen: %s\n",strerror(errno));
64         exit(1);
65     }
66 
67     while(1)
68     {
69         struct sockaddr_in clientaddr;
70         int c_len = sizeof(clientaddr);
71         int fd = accept(sockfd,(struct sockaddr*)&clientaddr,&c_len);
72         if(fd < 0)
73         {
74             fprintf(stderr,"accept: %s\n",strerror(errno));
75             continue;
76         }
77         out_client(clientaddr);
78         do_service(fd);
79         close(fd);
80     }
81     return 0;
82 }

 

编译: 

  gcc -o server server.c

 运行:

  ./server 6666

客户端:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <errno.h>
 4 #include <string.h>
 5 #include <netdb.h>
 6 #include <sys/socket.h>
 7 #include <netinet/in.h>
 8 #include <arpa/inet.h>
 9 #include <unistd.h>
10 
11 int sockfd;
12 
13 int main(int argc,char *argv[])
14 {
15     if(argc < 3)
16     {
17         fprintf(stderr,"usage: %s port\n",argv[0]);
18         exit(1);
19     }
20 
21     sockfd = socket(AF_INET,SOCK_STREAM,0);
22     if(sockfd < 0)
23     {
24         fprintf(stderr,"socket:%s\n",strerror(errno));
25         exit(1);
26     }
27 
28     struct sockaddr_in sockaddr;
29     memset(&sockaddr,0,sizeof(sockaddr));
30     sockaddr.sin_family = AF_INET;
31     sockaddr.sin_port = htons(atoi(argv[2]));
32     inet_pton(AF_INET,argv[1],&sockaddr.sin_addr.s_addr);
33     socklen_t len = sizeof(sockaddr);
34 
35     if(connect(sockfd,(struct sockaddr*)&sockaddr,len) < 0)
36     {
37         fprintf(stderr,"connect: %s\n",strerror(errno));
38         exit(1);
39     }
40     char buffer[1024];
41     memset(buffer,0,sizeof(buffer));
42     ssize_t n;
43     if((n = read(sockfd,buffer,1024)) < 0)
44     {
45         fprintf(stderr,"read: %s\n",strerror(errno));
46         exit(1);
47     }
48     else
49     {
50         printf("%s\n",buffer);
51     }
52 
53     return 0;
54 }

编译: 

  gcc -o client client.c

 运行:

  ./client 192.168.0.30 6666 

posted @ 2016-08-03 15:56  极客先锋  阅读(666)  评论(0编辑  收藏  举报