Linux TCP协议的基础编程模型(3)

6.TCP数据的发送---系统调用send

#include<sys/types.h>

#include<sys/socket.h>

int send(int s, const void *msg, int len, int flages);

函数send应用于TCP协议的套接字通信中,s是远程地址连接的套接字描述符,指针msg指向待发送的数据信息,些信息共len个字节。flages是发送标志:MSG_OOB发送外带数据;MSG_DONTROUTE通知内核远程IP就在本地局域网内,消息中不加入路由信息。

函数send默认阻塞方式发送数据,返回成功发送的数据长度,失败返回-1并置errno。

注:send“成功”的含义是指数据被成功地发送,但不保证对方套接字成功地接收。

send(s, “Hello World!”, strlen(“Hello World!”), 0);

或者

Write(s, “Hello World!”, strlen(“Hello World!”));

7.TCP数据的接收---系统调用recv

#include<sys/types.h>

#include<sys/socket.h>

int recv(int s, void *buf, int len, int flages);

函数recv用于TCP协议的套接字通信中,s是远程地址连接的套接字描述符,指针buf指定了接收数据的缓冲区地址,该缓冲区最大可容纳len个字节数据。flages是接收标志:MSG_OOB接收外带数据;MSG_PEEK以窥视方式接收数据,即只接收而不从缓冲区中删除数据,下次调用recv或read仍然可以接收这些信息;MSG_WAITALL函数阻塞直到读取len字节数据为止。

函数recv默认以阻塞方式读取数据,返回成功接收的数据长度,如果没有接收到数据或套接字已经关闭则返回0,否则返回-1并置为errno。

recv(s, buf, sizeof(buf),0);

或者

read(s, buf, sizeof(buf);

8.Socket的关闭---系统调用shutdown

#include<sys/socket.h>

int shutdown(int s, int how);

返回值:成功返回0,否则返回-1并置errno。

套接字本身也是一个文件,因此可以调用函数close关闭套接字来终止通信,也可以采用专门的套接字函数shutdown完成。参数how指定了套接字关闭的方式:0 套接字不可读;1套接字不可写;2彻底关闭套接字的连接。

9.服务器端程序

/* 提示宏 */

#define VERIFYERR(a, b)  \

if (a) \

{\

fprintf(stderr, "%s failed.\n", b);  \

return 0;\

}\

else  fprintf(stderr, "%s success.\n", b); 

int main()

{

int nSock, nSock1;        /* 定义SOCKET描述符 */

char buf[2048];

/* 创建端口号为9001的侦听套接字*/

VERIFYERR(CreateSock(&nSock, 9001, 9) != 0, "Create Listen SOCKET");  

/* 接收客户端连接申请,创建连接套接字nSock1 */

VERIFYERR(AcceptSock(&nSock1, nSock) != 0, "Link");      

memset(buf, 0, sizeof(buf));

/* 接收客户端发送的TCP数据信息 */

recv(nSock1, buf, sizeof(buf), 0);

fprintf(stderr, buf);

close(nSock1);                     /* 关闭侦听套接字 */

close(nSock);               /* 关闭连接套接字 */

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpjdf.html