免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2135 | 回复: 6
打印 上一主题 下一主题

[C] 求助(关于socket):运行出错,我不知道错在哪里 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-28 21:12 |只看该作者 |倒序浏览
运行出现死循环:recvfrom(): Transport endpoint is not connected
觉得没错,但是错了

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>

#define SERVER_PORT 3333
#define BUFSIZE 512

int main()
{
        socklen_t addrlen;
        char buf[BUFSIZE];
        int my_sockfd;
        int types_recv;
        struct sockaddr_in my_sockaddr, new_sockaddr;

        my_sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (my_sockfd < 0)
        {
                perror("socket()";
                exit(1);
        }
        my_sockaddr.sin_family = AF_INET;
        my_sockaddr.sin_port = htons(SERVER_PORT);
        my_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        bzero(&(my_sockaddr.sin_zero), ;
        if (bind(my_sockfd, (struct sockaddr *)&my_sockaddr, sizeof(struct sockaddr_in)) < 0)
        {
                perror("bind()";
                exit(1);
        }
        while (1)
        {
                addrlen = sizeof(struct sockaddr_in);
                types_recv = recvfrom(my_sockfd, buf, BUFSIZE-1, 0, (struct sockaddr *)&new_sockaddr, &addrlen);
                if (types_recv < 0)
                {
                        perror("recvfrom()";
                        continue;
                }
                printf("Get packet from IP(%s)\n", inet_ntoa(new_sockaddr.sin_addr));
                printf("packet is (%d) types long\n", types_recv);
                buf[types_recv] = '\0';
                printf("packet contains: \"%s\"\n", buf);
        }

        close(my_sockfd);
        exit(0);
}
                                                                                                            54,1         底端

论坛徽章:
0
2 [报告]
发表于 2009-08-28 21:34 |只看该作者
我的理解,recvfrom是用于udp的,而看你的socket(AF_INET, SOCK_STREAM, 0); 明显是用的tcp, 而且还没用listen监听,而TCP应该是先accept,连接到一客户机时再read;如果想用udp,打开时应该用socket(AF_INET,SOCK_DGRAM, 0);

论坛徽章:
0
3 [报告]
发表于 2009-08-28 22:34 |只看该作者
Transport endpoint is not connected没试,不过看这个端口未连接,我也不认为流式套接字能这么干

论坛徽章:
0
4 [报告]
发表于 2009-08-28 22:40 |只看该作者
原帖由 rollin7 于 2009-8-28 21:34 发表
我的理解,recvfrom是用于udp的,而看你的socket(AF_INET, SOCK_STREAM, 0); 明显是用的tcp, 而且还没用listen监听,而TCP应该是先accept,连接到一客户机时再read;如果想用udp,打开时应该用socket(AF_INET,SO ...

非常感谢!!!
我从头到尾看了N遍没发现这,你们一下就看出来了
我是想用UDP。

论坛徽章:
0
5 [报告]
发表于 2009-08-29 16:31 |只看该作者
请问LZ,你做的是客户端还是服务端?
recvfrom(): Transport endpoint is not connected
你缺少了connect()

论坛徽章:
0
6 [报告]
发表于 2009-08-29 16:33 |只看该作者
你在socket()之后需要connect(),接着是bind(),不过作为客户端的话,可以不用绑定bind(),直接recv()

论坛徽章:
0
7 [报告]
发表于 2009-08-29 18:39 |只看该作者
原帖由 herocsz 于 2009-8-29 16:33 发表
你在socket()之后需要connect(),接着是bind(),不过作为客户端的话,可以不用绑定bind(),直接recv()


用udp的话,无论是服户端或客户端都可以不用connect()的,直接用sendto()和recvfrom()就行了。

只是服务端在打开socket之后是一定要bind()的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP