- 论坛徽章:
- 0
|
我用 python 写了个小程序在本地听,但不 accept,然后用你的程序去连(改了连接地址),结果是 timeout
- #!/usr/bin/python
- import socket
- ss=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- ss.bind(('127.0.0.1',8080))
- ss.listen(8080)
- while True:
- None;
复制代码
- #include<sys/types.h>
- #include<sys/socket.h>
- #include<arpa/inet.h>
- #include<fcntl.h>
- #include<stdio.h>
- #include<errno.h>
- #include<string.h>
- #include<sys/select.h>
- int
- main (void)
- {
- int s, r, ret, len, error;
- char buf[20];
- struct sockaddr_in sock;
- fd_set rset, wset;
- struct timeval tv;
- tv.tv_sec = 10;
- s = socket (AF_INET, SOCK_STREAM, 0);
- if (-1 == s)
- {
- printf ("socket() failed\n");
- return 1;
- }
- if (0 >
- fcntl (s, F_SETFL, fcntl (s, F_GETFL, 0) | /*O_NDELAY */ O_NONBLOCK))
- { /*非阻塞 */
- printf ("fcntl failed\n");
- return 1;
- }
- sock.sin_family = PF_INET;
- sock.sin_port = htons (8080);
- sock.sin_addr.s_addr =inet_addr("127.0.0.1");
- if (-1 ==
- (ret =
- connect (s, (struct sockaddr *) &sock, sizeof (struct sockaddr_in))))
- {
- if (EINPROGRESS != errno)
- { /*if not fcntl->O_NDELAY, fall here */
- printf ("connect() failed:%s\n", strerror (errno));
- return 1;
- }
- }
- if (ret == 0)
- {
- printf ("connection ok at once\n");
- close (s);
- return 0;
- }
- FD_ZERO (&rset);
- FD_SET (s, &rset);
- wset = rset;
- if (-1 == (ret = select (s + 1, &rset, &wset, NULL, &tv)))
- { /*设置timeval时间参数 */
- close (s);
- printf ("select error\n");
- return 1;
- }
- if (0 == ret)
- {
- close (s);
- printf ("timeout\n");
- return 1;
- }
- if ( /*FD_ISSET(s,&rset) */ FD_ISSET (s, &wset))
- {
- len = sizeof (error);
- errno = 0;
- if (0 >
- (ret =
- getsockopt (s, SOL_SOCKET, SO_ERROR, (void *) &error, &len)))
- {
- close (s);
- printf ("getsockopt error:%s\n", strerror (errno));
- return 1;
- }
- if (error != 0)
- {
- printf ("getsockopt set error:%s\n", strerror (errno));
- close (s);
- return 1;
- }
- printf ("getsockopt success\n");
- }
- else
- {
- close (s);
- printf ("FD_ISSET error\n");
- return 1;
- }
- if (-1 == (ret = read (s, buf, sizeof (buf))))
- {
- printf ("read() failed\n");
- return 1;
- } /*如果连接成功就从server读取点东西 */
- printf ("ret=%d\n", ret);
- buf[ret - 1] = '\0';
- printf ("read:%s\n", buf);
- close (s);
- return 0;
- }
复制代码
[ 本帖最后由 win_hate 于 2009-5-13 15:06 编辑 ] |
|