www.pudn.com > linuxsocket.rar > my_recv.c
#define MY_RECV_C #include#include #include #include #include #include "my_recv.h" /*自定义的错误处理函数*/ void my_err(const char * err_string, int line) { fprintf(stderr, "line:%d ", line); perror(err_string); exit(1); } /* * 函数名: my_recv * 描 述 : 从套接字上读取一次数据(以'\n'为结束标志) * 参 数 : conn_fd -- 从该连接套接字上接收数据 * data_buf -- 读取到的数据保存在此缓冲中 * len -- data_buf所指向的空间长度 * 返回值: 出错返回-1, 服务器端已关闭连接则返回0, 成功返回读取的字节数 */ int my_recv(int conn_fd, char *data_buf, int len) { static char recv_buf[BUFSIZE]; // 自定义缓冲区,BUFSIZE定义在my_recv.h中 static char *pread; // 指向下一次读取数据的位置 static int len_remain = 0; // 自定义缓冲区中剩余字节数 int i; // 如果自定义缓冲区中没有数据,则从套接字读取数据 if (len_remain <= 0) { if ((len_remain =recv(conn_fd, recv_buf, sizeof (recv_buf), 0)) < 0) { my_err("recv", __LINE__); } else if (len_remain == 0) { // 目的计算机端的socket连接关闭 return 0; } pread = recv_buf; // 重新初始化pread指针 } // 从自定义缓冲区中读取一次数据 for (i=0; *pread != '\n'; i++) { if (i > len) { // 防止指针越界 return -1; } data_buf[i] = *pread++; len_remain--; } // 去除结束标志 len_remain--; pread++; return i; // 读取成功 }