红联Linux门户
Linux帮助

关于套接字的问题

发布时间:2010-11-18 16:56:47来源:红联作者:wucongdonglai
最近看套接字的相关章节,看到一个例子,在服务端建立套接字,并且在等待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里写入之后,自动会阻塞当前客户端啊?
文章评论

共有 6 条评论

  1. wucongdonglai 于 2010-11-20 14:36:07发表:

    6# yqw1122
    哎,对于网络方面,我最小白了!

  2. yqw1122 于 2010-11-20 10:24:53发表:

    5# wucongdonglai


    这本书我也只是看了一部分,感觉不错,名著。但是,看这本书要有点系统编程(进程、线程等)和网络体系的知识。

  3. wucongdonglai 于 2010-11-20 08:30:27发表:

    4# yqw1122
    恩,这的确只是一个简单的事例,那书已经定了,估计这几天就送过来了!呵呵,谢谢啊

  4. 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复用解决。

    我说的也不太清楚,你最好是看我推荐给你的那本书,讲的很明白。

  5. wucongdonglai 于 2010-11-19 17:28:20发表:

    2# yqw1122
    恩,那是哪个语句堵塞这个进程的啊?看输出好像是read堵塞的啊

  6. 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网络编程》,特别好的书。