关于连接的UDP套接口

javadream11 2010-10-04 12:31:51
对于连接的UDP套接口,异步错误会返回给进程, 可是为什么还是堵塞在read上没返回呢?
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#define SER_PORT 9877
#define MAXLINE 4096

void dg_cli(FILE *fp, int sockfd, const struct sockaddr *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE+1];

if(connect(sockfd, (struct sockaddr*)pservaddr, servlen) != 0) {
printf("connect error: %s\n", strerror(errno));
exit(1);
}
while(fgets(sendline, MAXLINE, fp) != NULL) {
n = strlen(sendline);
if(write(sockfd, sendline, strlen(sendline)) != n) {
printf("write error : %s", strerror(errno));
exit(1);
}

n = read(sockfd, recvline, MAXLINE); //在这里没有返回错误
if(n < 0)
printf("read error : %s", strerror(errno));
printf("after n %d\n", n);
recvline[n] = 0;
fputs(recvline, stdout);
}
}

int main()
{
int sockfd;
struct sockaddr_in servaddr;

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "192.168.1.2", (void*)&servaddr.sin_addr);
servaddr.sin_port = htons(SER_PORT);

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

dg_cli(stdin, sockfd,(struct sockaddr*)&servaddr, sizeof(servaddr));

return 0;
}
...全文
41 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
justkk 2010-10-05
  • 打赏
  • 举报
回复
应该是服务端没有发送应答报文吧
看看服务端的日志..
小魔菇 2010-10-04
  • 打赏
  • 举报
回复
不是说 if(n < 0)就没有错误
好好看下read的返回值中的各种状态
tangxianghenggood 2010-10-04
  • 打赏
  • 举报
回复
来关注一下
louyong0571 2010-10-04
  • 打赏
  • 举报
回复
man一下看看具体返回值的意义吧

23,121

社区成员

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

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