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); /* 关闭连接套接字 */
}