当前位置: 技术问答>linux和unix
关于socket的一些问题
来源: 互联网 发布时间:2016-09-20
本文导语: 刚开始看socket,很疑惑。 下面这个程序是我在网上找的,但是在printf("server: got connection from %sn",inet_ntoa(their_addr.sin_addr)); 输出客户端的ip地址时报 段错误,注释掉这句就没有问题了,我用的Linux环境,请问是什么...
刚开始看socket,很疑惑。
下面这个程序是我在网上找的,但是在printf("server: got connection from %sn",inet_ntoa(their_addr.sin_addr));
输出客户端的ip地址时报 段错误,注释掉这句就没有问题了,我用的Linux环境,请问是什么原因啊。
服务器代码:
=======
还有,请问大家哪里有比较好的讲解socket的资料,可以让初学者进行系统的学习来入门。
下面这个程序是我在网上找的,但是在printf("server: got connection from %sn",inet_ntoa(their_addr.sin_addr));
输出客户端的ip地址时报 段错误,注释掉这句就没有问题了,我用的Linux环境,请问是什么原因啊。
服务器代码:
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3490 /* the port users will be connecting to */
#define BACKLOG 10 /* how many pending connections queue will hold */
main()
{
int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */
struct sockaddr_in my_addr; /* my address information */
struct sockaddr_in their_addr; /* connector's address information */
int sin_size;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(MYPORT); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
== -1) {
perror("bind");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
while(1) { /* main accept() loop */
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,
&sin_size)) == -1) {
perror("accept");
continue;
}
printf("server: got connection from %sn",
inet_ntoa(their_addr.sin_addr));
if (!fork()) { /* this is the child process */
if (send(new_fd, "Hello, world!n", 14, 0) == -1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd); /* parent doesn't need this */
while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
}
}
=======
还有,请问大家哪里有比较好的讲解socket的资料,可以让初学者进行系统的学习来入门。
|
我用gcc -Wall编译楼主的代码,有这么一个警告:
warning: implicit declaration of function âinet_ntoaâ
warning: format â%sâ expects type âchar *â, but argument 2 has type âintâ
由于少了头文件,第一个警告说没有inet_ntoa的声明所以就采用默认声明,认为它返回int,结果就是按照int来取inet_ntoa的返回值并且送给printf
我的系统是64位的,指针是8个字节,int是4个字节,所以我运行的时候出现了段错误,加了头文件就没问题了。
如果是32位系统,指针和int都是4个字节,就不太清楚结果会怎么样了
warning: implicit declaration of function âinet_ntoaâ
warning: format â%sâ expects type âchar *â, but argument 2 has type âintâ
由于少了头文件,第一个警告说没有inet_ntoa的声明所以就采用默认声明,认为它返回int,结果就是按照int来取inet_ntoa的返回值并且送给printf
我的系统是64位的,指针是8个字节,int是4个字节,所以我运行的时候出现了段错误,加了头文件就没问题了。
如果是32位系统,指针和int都是4个字节,就不太清楚结果会怎么样了
|
少了个inet_ntoa的头文件,不知道是不是这个原因引起段错误,加上试试吧。
#include
#include
|
《Unix网络编程》
|
while(1)
{ /* main accept() loop */
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,
&sin_size)) == -1)
{
perror("accept");
continue;
} //下面这句printf,在什么情况下会输出?
printf("server: got connection from %sn",
inet_ntoa(their_addr.sin_addr));
if (!fork()) { /* this is the child process */
if (send(new_fd, "Hello, world!n", 14, 0) == -1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd); /* parent doesn't need this */
while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
}
printf()的地方不对。
accept会一直阻塞在那里,直到有client有请求并连接上为止,这个时候accept会返回
返回错误就打印错误信息执行perror,然后continue.
显然,这个地方当accept返回正确的时候,就会要printf()。所以这个printf的位置不对哈。
|
我在这个帖子上看到跟你差不多的代码 那人说有问题 可是我执行ok
http://bbs3.chinaunix.net/archiver/?tid-1757540.html
执行过程
[root@CentOS src]# ./client 127.0.0.1 hello
sent 5 bytes to 127.0.0.1
[root@CentOS src]# ./server
got packet from 127.0.0.1
packet is 5 bytes long
packet contains "hello"
http://bbs3.chinaunix.net/archiver/?tid-1757540.html
执行过程
[root@CentOS src]# ./client 127.0.0.1 hello
sent 5 bytes to 127.0.0.1
[root@CentOS src]# ./server
got packet from 127.0.0.1
packet is 5 bytes long
packet contains "hello"
|
由于少了头文件,第一个警告说没有inet_ntoa的声明所以就采用默认声明,认为它返回int,结果就是按照int来取inet_ntoa的返回值并且送给printf
-----------
如果是这样 将错就错 把printf里的%s改成%d 我估计不会报段错误了 会有什么效果啊?
楼主测试下试试?
-----------
如果是这样 将错就错 把printf里的%s改成%d 我估计不会报段错误了 会有什么效果啊?
楼主测试下试试?