我生成了一个5G的大文件。同时传输的过程中,我把网卡拔掉,最后数据传输完毕。
不过这是一个很傻逼的行为,因为直接把网卡拔掉就可以测试。
至于原因 @pansz已经提到了。 虽然我行为是傻逼了点,不过写这个程序的过程中还是收获不少呢,因为刚学网络编程,多挖几个坑还自己还是有好处的。
代码如下:
生成文件的代码:
#define SIZE 5000000
#define OPEN_MODE 00777
int main(int argc,char **argv){
srand(time(NULL))
int fd=open("output.txt",O_APPEND|O_RDWR)
int n=0
char buf[1024]={0}
for(int i=0i<SIZEi++){
for(int j=0j<1023j++){
buf[j]=(char)(rand()%94+32)
}
buf[1023]='\0'
n=write(fd,buf,1024)
}
close(fd)
return 0
}
Client
int len=0
while((len=read(fd,sendline,1024))){
if( send(sockfd,sendline,strlen(sendline), 0) <0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno)
exit(0)
}
if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1) {
perror("recv error")
exit(1)
}
memset(sendline,0,1024)
buf[rec_len] = '\0'
printf("Received : %s ",buf)
}
close(sockfd)
Server
void Server::EventLoop(){
int fd=open("re.txt",O_APPEND | O_RDWR)
cout<<"waiting for client's request."<<endl
if((cfd=accept(sfd,reinterpret_cast<struct sockaddr*>(NULL),NULL))==-1){
std::cerr<<"acceprt error!"<<endl
}
while(1){
nread=recv(cfd,buf,BUF_SIZE,0)
buf[nread]='\0'
write(fd,buf,nread)
printf("the size is: %zd\n",nread)
if(send(cfd,"Yeah I have receive your message.\n",40,0)==-1){
std::cerr<<"send error."<<endl
exit(-1)
}
}
close(sfd)
}
首先,第一socket是和平台无关的,他是一套规则,所有的平台都是通用的。第二socket肯定能用于arm开发板上linux和windows的通信。第三,虽然socket和平台无关,但是在linux下和windows下的编写会有些差异,主要表现在包含的库和头文件上,还有windows对socket还自定义的一些东西,具体的去学习下socket,或者说windows网络编程,还有linux网络编程之类的知识吧多看书阿...用select或者poll或者epoll吧..还有一个类似的
功能就是,等待事件发生,比如某个socket(或者句柄)有了数据什么的,select可以判断出来,并且返回,让你知道哪个socket出现事情了。他监听的句柄范围中没事情发生时,进程或者线程就阻塞(超时时间可以设置).
这样你就可以在select知道哪个出现数据之后,再去 *** 作对应的socket
你说相互通信,干吗还要中转,自己用ip:port就好了阿...
要是大家都对服务器有某个请求,服务器端就用select吧..如果你处理的链接数很大,就用poll或者epoll吧,效果更好....剩下的自己去查资料...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)