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
请问这两种运行方式有什么区别?
1.是否能PING通 (比如防火墙的原因)
2.查看下errno值是什么 , connect下面紧接着如果返回-1 , 就使用perror("connect error");输出错误信息是什么 。
找到了,是因为防火墙的原因。谢谢 但是怎样才能通过防火墙?别的使用tcp协议的包为什么就能通过iptables? 可能跟你define PORT 1234 端口有关系的!别的服务器好多使用的是常用端口! iptables的策略对这些端口是不拦截的! 看下iptables是不是没有开放这个端口1234 哦....呵呵 大意了,谢谢各位.... 还有个问题,在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: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 共勉! 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