作者chchwy (mat)
看板NTUE-CS100
标题Re: [课业] ftp两三事
时间Thu Jun 4 02:57:14 2009
前一篇里我们用了两个自定的函数
writeString(): 将字串写进socket
readString() : 则会从socket读出字串
用法如下
writeString( socket, 字串 );
readString ( socket, 字串 );
这是我自己写的函数,为什麽要写这两个函数呢?
课本内建的函数readn()和writen()
readn()会从socket读n bytes,writen()则是写n bytes
我举个例子,假设今天server要告诉client一句话
Server这样写
===============
char talk[] = "hi girl~"; //这行字串8 bytes
write(connfd, talk, strlen(talk) );
...
Client准备接收这一句话
===================
char talk[512];
readn(sockfd, recv_str, ???? ); //要收几个bytes? 不知道耶┐(─_─)┌
//天知道server送了几个bytes过来....
所以最好的方法就是送资料之前先告知对方资料长度
1.我要送25个bytes罗
2.接着才把25个bytes内容写过去
对方就可以
1.收到数字25,准备好接收内容
2.呼叫readn(sockfd, buffer, 25) 准确接收,一字不差!
以下是实做内容
void writeString(int sockfd, char *buffer){
int length = strlen(buffer);
writeInt(sockfd, length); //先把字串长度写过去
writen(sockfd, buffer, length); //再来才送字串内容
}
void readString(int sockfd, char *buffer ){
int len = readInt(sockfd); //先取得字串长度len
readn(sockfd, buffer, len); //恰好收取len个bytes。
buffer[len] = 0; //字串结尾
}
上面又呼叫了两个自订函数writeInt() 跟 readInt()
有兴趣的人就自己研读吧
//将整数number写进socket
void writeInt(int sockfd, int number){
char str_num[12+1];
sprintf(str_num, "%12d", number);
writen( sockfd, str_num, 12);
}
//从socket读取一个整数
int readInt( int sockfd ){
char str_num[12+1];
readn(sockfd, str_num, 12);
str_num[12] = 0;
int number = atoi(str_num);
return number;
}
--
-- P_Mat <无名个人版> bbs.wretch.cc
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.68.15.209
※ 编辑: chchwy 来自: 140.115.50.29 (06/15 14:14)