月度归档:2017年05月

Socket编程:解决发送与接收数据不全

这个问题是在上个月在做的项目中遇到的问题。项目采用分布式计算,通过网线传输数据。然而却发现用Socket接收和发送数据会出现不全的问题。由于是第一次使用Socket,因此这个问题还是费了点时间去解决。现在把它整理下。


客户端
原来的编程方案:(错误)

//创建套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
//向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
serv_addr.sin_family = AF_INET;  //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("169.254.48.205");  //具体的IP地址
serv_addr.sin_port = htons(1234);  //端口
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//向服务器发送数据
printf("Sending...\n");
write(sock, (char*)conv_ouput, sizeof(float) * 25088);
printf("Send Successful\n");
//关闭套接字
close(sock);

这里有个问题,即是发送端不能保证一次性全部发完数据。因此必须确保发送到能够发全数据。

修改后的编程方案:(正确)

int sock = socket(AF_INET, SOCK_STREAM, 0);
//向服务器(特定的IP和端口)发起请求
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充
serv_addr.sin_family = AF_INET;  //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("169.254.48.205");  //具体的IP地址
serv_addr.sin_port = htons(1234);  //端口
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//向服务器发送数据
printf("Sending...\n");
int pos = 0;
while(pos < 25088*sizeof(float))
{
	int send_num = send(sock,(char*)conv_ouput+pos, sizeof(float) * 25088, 0);
	if(send_num<=0)
	{
		break;
		printf("send error\n");
	}
	pos += send_num;
}
printf("send num = %d\n",pos);
printf("Send Successful\n");
//关闭套接字
close(sock);

继续阅读

中科院offer!!!

我从来也没有想到我能去中科院实习。周二我在实习僧上看到中科院在招聘实习,于是抱着试试的态度发了简历,没想到第二天就电话面试,面试还很顺利。也就问我现在在做的项目,最后竟然直接说:”那我给你发offer吧~“。真的是把我高兴坏了~真的是高兴坏了~高兴得我把正在睡午觉的舍友摇醒~跟他分享喜悦。第一时间告诉了老爸,姐姐。这两天渐渐平静下来了。

终于要出远门了!从高考后就一心想着考出省,去外面看看。然而现实是在省内选个一本院校容易,在省外选好学校就有可能上不了。于是大学继续省内读书,其实是市内读书。接着就是考研。也是选择离家一千公里的学校,不过最后也是没成。不过我总是能接受现实,于是又留在了市内读研。

现在终于有机会了。但现在的我,就好像一个在浅水区游惯的人,突然到海里去游泳一样。心里有一种巨大的压力感,是对陌生水域的恐惧。

不过人生就是这样,一步一步的往前迈。