select客户端的使用

legone2008 2008-07-30 10:45:10
环境:RedHat Enterprise Linux AS 4 + C(C语言)
我想请问一下,客户端如何使用select呢?客户的功能是发送一条数据给服务端,然后等待接收服务端的返回数据。
是不是要监视某个描述符是否可写,可写就发送数据?那是在什么情况下就可以写了呢?
我在connect之后就监听描述符,但是不行,没有可写的描述符。
谢谢!
...全文
325 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐田伯光 2008-07-30
  • 打赏
  • 举报
回复
connect 成功了就可写了。经常先把connect使用的socket设为非阻塞,然后用select检测这个句柄是否可写来达到非阻赛的connect.
fuqd273 2008-07-30
  • 打赏
  • 举报
回复
具体的后续流程和你采取的socket的协议参数有关。
上边的例子是telnet的client端的简单框架。

但是基本就是对socket函数的返回值进行读写,不知道你所说的没有可写的描述符是什么意思?
fuqd273 2008-07-30
  • 打赏
  • 举报
回复
一个简单例子:
Socket Programming


#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <linux/in.h>
#include <sys/socket.h>
#include <unistd.h>


#define buflen 512
unsigned int portno = 3333;
char hostname[] = "192.168.100.2";

char *buf[buflen]; /* declare global to avoid stack */

void dia(char *sz) { printf("Dia %s\n", sz); }

int printFromSocket(int sd, char *buf)
{
int len = buflen+1;
int continueflag=1;
while((len >= buflen)&&(continueflag)) /* quit b4 U read an empty socket */
{
len = read(sd, buf, buflen);
write(1,buf,len);
buf[buflen-1]='\0'; /* Note bug if "Finished" ends the buffer */
continueflag=(strstr(buf, "Finished")==NULL); /* terminate if server says "Finished" */
}
return(continueflag);
}


main()
{
int sd = socket(AF_INET, SOCK_STREAM, 0); /* init socket descriptor */
struct sockaddr_in sin;
struct hostent *host = gethostbyname(hostname);
char buf[buflen];
int len;

/*** PLACE DATA IN sockaddr_in struct ***/
memcpy(&sin.sin_addr.s_addr, host->h_addr, host->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons(portno);

/*** CONNECT SOCKET TO THE SERVICE DESCRIBED BY sockaddr_in struct ***/
if (connect(sd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
perror("connecting");
exit(1);
}

sleep(1); /* give server time to reply */
while(1)
{
printf("\n\n");
if(!printFromSocket(sd, buf)) break;
fgets(buf, buflen, stdin); /* remember, fgets appends the newline */
write(sd, buf, strlen(buf));
sleep(1); /* give server time to reply */
}
close(sd);
}
pottichu 2008-07-30
  • 打赏
  • 举报
回复
把你的代码贴出来..

另外可以去看看
http://zhanjun.net/?q=node/12
fierygnu 2008-07-30
  • 打赏
  • 举报
回复
要在listen socket上检测可读。
是否检测socket可写,跟协议和应用有关。比如ftp的数据连接,根据发送方向,在发送方就可以检测socket是否可写。
legone2008 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fuqd273 的回复:]
具体的后续流程和你采取的socket的协议参数有关。
上边的例子是telnet的client端的简单框架。

但是基本就是对socket函数的返回值进行读写,不知道你所说的没有可写的描述符是什么意思?
[/Quote]
我的意思是(流程如下),

client端:
fd_set wfds;

sockfd = socket(..)
connect( sockfd,...)

FD_SET( sockfd, &wfds )
select( sockfd+1, NULL, &wfds, NULL,NULL)

当客户端调用connect之后(连接上了),是不是select就检测到sockfd可写了呢?但我写了个程序,到这里select是阻塞。

guosha说:经常先把connect使用的socket设为非阻塞,然后用select检测这个句柄是否可写来达到非阻赛的connect.
这个我去试下。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧