全球旧事资料 分类
假设输入的是IP所以调用i
et_ato
r
失败的时候再调用gethostby
ame而得到信息r
r
四Li
ux网络编程4完整的读写函数r
r
一旦我们建立了连接我们的下一步就是进行通信了在Li
ux下面把我们前面建立的通道看成是文件描述符r
这样服务器端和客户端进行通信时候只要往文件描述符里面读写东西了就象我们往文件读写一样r
r
41写函数writer
ssize_twritei
tfdco
stvoidbufsize_t
bytesr
r
write函数将buf中的
bytes字节内容写入文件描述符fd成功时返回写的字节数失败时返回1并设置err
o变量r
在网络程序中当我们向套接字文件描述符写时有俩种可能r
r
1write的返回值大于0表示写了部分或者是全部的数据r
r
2返回的值小于0此时出现了错误我们要根据错误类型来处理r
r
如果错误为EINTR表示在写的时候出现了中断错误r
如果为EPIPE表示网络连接出现了问题对方已经关闭了连接r
为了处理以上的情况我们自己编写一个写函数来处理这几种情况r
r
i
tmy_writei
tfdvoidbufferi
tle
gthr
r
i
tbytes_leftr
i
twritte
_bytesr
charptrr
r
ptrbufferr
bytes_leftle
gthr
whilebytes_left0r
r
开始写r
writte
_byteswritefdptrbytes_leftr
ifwritte
_bytes0出错了r
r
iferr
oEINTR中断错误我们继续写r
writte
_bytes0r
else其他错误没有办法只好撤退了r
retur
1r
r
bytes_leftwritte
_bytesr
ptrwritte
_bytes从剩下的地方继续写r
r
retur
0r
r
r
42读函数readr
ssize_treadi
tfdvoidbufsize_t
byteread函数是负责从fd中读取内容当读成功时r
read返回实际所读的字节数如果返回的值是0表示已经读到文件的结束了小于0表示出现了错误r
如果错误为EINTR说明读是由中断引起的r
如果是ECONNREST表示网络连接出了问题和上面一样我们也写一个自己的读函数r
r
i
tmy_readi
tfdvoidbufferi
tle
gthr
r
i
tbytes_leftr
i
tbytes_readr
charptrr
r
bytes_leftle
gthr
whilebytes_left0r
r
bytes_readreadfdptrbytes_readr
ifbytes_read0r
r
iferr
oEINTRr
bytes_read0r
elser
retur
1r
r
elseifbytes_read0r
breakr
bytes_leftbytes_readr
ptrbytes_readr
r
retur
le
gthbytes_leftr
r
r
r
43数据的传递r
有了上面的两个函数我们就可以向客户端或者是服务端传递数据了比如我们要传递一个结构可以使用如下方式r
r
r
客户端向服务端写r
structmy_structmy_struct_clie
tr
writefdvoidmy_struct_clie
tsizeofstructmy_structr
r
服务端的读r
charbuffersizr
好听全球资料 返回顶部