最近看套接字的相关章节,看到一个例子,在服务端建立套接字,并且在等待accept时,客户端程序里有这么一段:
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
perror("oops: client1");
exit(1);
}
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("char from server = %c\n", ch);
close(sockfd);
exit(0);
从结果来看,是在运行完write之后就运行服务端程序了!这是不是意思是当客户端往sockfd里写入之后,自动会阻塞当前客户端啊?
wucongdonglai 于 2010-11-20 14:36:07发表:
6# yqw1122
哎,对于网络方面,我最小白了!
yqw1122 于 2010-11-20 10:24:53发表:
5# wucongdonglai
这本书我也只是看了一部分,感觉不错,名著。但是,看这本书要有点系统编程(进程、线程等)和网络体系的知识。
wucongdonglai 于 2010-11-20 08:30:27发表:
4# yqw1122
恩,这的确只是一个简单的事例,那书已经定了,估计这几天就送过来了!呵呵,谢谢啊
yqw1122 于 2010-11-19 23:41:33发表:
[i=s] 本帖最后由 yqw1122 于 2010-11-19 23:44 编辑 [/i]
3# wucongdonglai
I/O的类型,有阻塞I/O,非阻塞I/O,I/O复用等,
阻塞I/O就是要等待一个i/o操作完成才可以进行下面的操作,否则等待,就如scanf("%d",&a),你不输入数字回车就一直等待。
而I/o复用就不同了,会监视文件标识符,如果有哪个文件标识符有改变就进行相应的操作,不用等待(不用依赖固有的顺序)。
这个程序有个问题,你就是按照从服务器上获得数据->发送数据到服务器的顺序,不能够随意的交互,就是要等read()完成,然后才能write,肯定是不科学的。这样的程序只符合简单的学习,而实际的应用就不行了,我们必须做到随时的接收和发送数据,故用I/o复用解决。
我说的也不太清楚,你最好是看我推荐给你的那本书,讲的很明白。
wucongdonglai 于 2010-11-19 17:28:20发表:
2# yqw1122
恩,那是哪个语句堵塞这个进程的啊?看输出好像是read堵塞的啊
yqw1122 于 2010-11-19 14:10:29发表:
[i=s] 本帖最后由 yqw1122 于 2010-11-19 14:16 编辑 [/i]
程序解析:
◆tcp实现的socket
◆connect()函数连接服务器
◆write()函数,实现把字符ch发送给服务器
◆read()函数,实现从服务器接收一个字符,保存到ch里
阻塞在这个程序是必然的,可以通过I/O复用解决这个问题,详看select、poll函数的用法。
推荐看《Unix网络编程》,特别好的书。