【发布时间】:2011-05-30 07:02:31
【问题描述】:
您好,我编写了以 udp 数据包发送文件的 linux 守护程序。
问题是在字符串"abc\0asdf" 中它只发送abc 而不是空字符和asdf(空符号后的所有字符),
有udp客户端代码,发送数据包:
int sock;
struct sockaddr_in server_addr;
struct hostent *host;
host= (struct hostent *) gethostbyname((char *)ip);
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
perror("socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
memset(server_addr.sin_zero,0,8);
以及发送缓冲区的代码:
if (sendto(sock, buf, sizeof buf, 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))==-1)
在服务器端我需要接收二进制缓冲区:
定义套接字代码:
int sock;
int addr_len, bytes_read;
struct sockaddr_in server_addr , client_addr;
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("Socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = INADDR_ANY;
//bzero(&(server_addr.sin_zero),8);
memset(server_addr.sin_zero,0,8);
if (bind(sock,(struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1){
perror("Bind");
exit(1);
}
addr_len = sizeof(struct sockaddr);
diep("sendto()");
并接收缓冲区(在大循环中):
bytes_read = recvfrom(sock,buf,sizeof (buf),0,
(struct sockaddr *)&client_addr, &addr_len);
有人知道为什么我没有收到完整的缓冲区吗?
【问题讨论】:
-
你如何验证
buf的内容?bytes_read的值与sendto的返回值是多少? -
sender返回发送5000字节,receive返回读取5000字节,buf大小为500字节。
-
sorry buf size也定义为5000字节
-
@crab,你的问题是什么?你得到的正是你发送的数据量
-
@crab,我猜,你会有一个
printf("%s",buf);声明来验证你的问题。它最多只能读取\0。