yangfan876 发表于 2012-07-12 21:46

linux socket小例子

大家好:
最近在看linux网络编程,关于socket编程的一个例子弄不明白,下面是代码:

server.c:
1 #include<stdio.h>                                                                                                                              
2 #include<unistd.h>
3 #include<sys/types.h>
4 #include<sys/socket.h>
5 #include<netinet/in.h>
6 #include<arpa/inet.h>
7 #include<strings.h>
8
9 #define PORT 1234
10 #define BACKLOG 1
11
12 main ()
13 {
14   int listenfd, connectfd;
15   struct sockaddr_in server;
16   struct sockaddr_in client;
17   socklen_t addrlen;
18   if ((listenfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
19   {
20         printf ("listenfd create failed \n");
21         exit (-1);
22   }
23   int opt = SO_REUSEADDR;
24   setsockopt (listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt));
25   memset (&server, 0, sizeof (struct sockaddr_in));
26   server.sin_family = AF_INET;
27   server.sin_port = htons (PORT);
28   server.sin_addr.s_addr = INADDR_ANY;
29   if (bind (listenfd, (struct sockaddr *) &server, sizeof (struct sockaddr_in)) == -1)
30   {
31         printf ("bind error \n");
32         exit (-1);
33   }
34   if (listen (listenfd, BACKLOG) == -1)   
35   {
36         printf ("listen() error\n");
37         exit (-1);
38   }
39   int len = sizeof (client);
40   if ((connectfd = accept (listenfd, (struct sockaddr *) &client, & addrlen)) == -1)
41   {
42         printf ("accept() error\n");
43         exit (-1);
44   }
45   printf ("You got a connection from client's ip is %s, port is %d \n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
46   send (connectfd, "Welcome\n", 8, 0);
47   close (connectfd);
48   close (listenfd);
49 }                     
client.c:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<sys/types.h>
4 #include<strings.h>
5 #include<sys/socket.h>
6 #include<netinet/in.h>
7 #include<netdb.h>
8
9 #define PORT 1234
10 #define MAXDATASIZ 100
11
12 main (int argc, char **argv)
13 {
14   int sockfd, num;
15   char buf ;
16   struct hostent *he;
17   struct sockaddr_in server;
18
19   if ((he=gethostbyname (argv)) == NULL)
20   {
21         printf ("gethostbyname () error\n");
22         exit (-1);
23   }
24
25   if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)                                                                                       
26   {
27         printf ("socket () error \n");
28         exit (-1);
29   }
30
31   memset (&server, 0, sizeof (server));
32   server.sin_family = AF_INET;
33   server.sin_port = htons (PORT);
34   server.sin_addr = *((struct in_addr *)he->h_addr);
35   if (connect (sockfd, (struct sockaddr *)&server, sizeof (server)) == -1)
36   {
37         printf ("connect () error\n");
38         exit (-1);
39   }
40   if ((num = recv (sockfd, buf, MAXDATASIZ,0)) == -1)
41   {
42         printf ("recv() error\n");
43         exit (-1);
44   }
45   buf = '\0';
46   printf ("server message: %s\n", buf);
47   close (sockfd);
48 }      

            

问题是当在同一台机子上运行,使用ip:127.0.0.1时能正常运行,但是统一局域网内的两台机子上运行就会出现connect error

请问这两种运行方式有什么区别?

fdl19881 发表于 2012-07-12 22:14

1.是否能PING通 (比如防火墙的原因)
2.查看下errno值是什么 , connect下面紧接着如果返回-1 , 就使用perror("connect error");输出错误信息是什么 。

yangfan876 发表于 2012-07-12 22:21

找到了,是因为防火墙的原因。谢谢

yangfan876 发表于 2012-07-12 22:25

但是怎样才能通过防火墙?别的使用tcp协议的包为什么就能通过iptables?

xiyoulaoyuanjia 发表于 2012-07-12 23:08

可能跟你define PORT 1234 端口有关系的!别的服务器好多使用的是常用端口! iptables的策略对这些端口是不拦截的!

luoyan_xy 发表于 2012-07-12 23:31

看下iptables是不是没有开放这个端口1234

yangfan876 发表于 2012-07-13 09:03

哦....呵呵   大意了,谢谢各位....

yangfan876 发表于 2012-07-13 09:16

还有个问题,在client.c中34行令人费解server.sin_addr = *((struct in_addr *)he->h_addr);其中 he 是定义在16行,struct hostent *he;我不明白的是在hostent这个结构体中并没有h_addr这个成员变量,为什么还能这样引用,编译时也没有报错,并且能正确执行。

求解.....

liuchang8877 发表于 2012-07-13 11:08

本帖最后由 liuchang8877 于 2012-07-13 11:11 编辑

回复 8# yangfan876   
      struct hostent {
   char *h_name;
   char **h_aliases;
   int h_addrtype;
   int h_length;
   char **h_addr_list;
   };
   #define h_addr h_addr_list
#define h_addr h_addr_list这一句定义了 ,
he->h_addr 是一个 char *,
需要的是 struct in_addr *。因此,我转换 he->h_addr 成 struct in_addr *,这是个指针,取他的内容,即 *,然后赋给左边


    我也是初学者, 我的博客http://firefrog.sinaapp.com   共勉!

yangfan876 发表于 2012-07-13 14:01

liuchang8877 发表于 2012-07-13 11:08 static/image/common/back.gif
回复 8# yangfan876 #define h_addr h_addr_list这一句定义了 ,
he->h_addr 是一个 char *,
需要 ...

非常感谢。那个源代码你是在那儿查看的?
页: [1] 2
查看完整版本: linux socket小例子