Day 8.TCP通信
TCP通信
TCP发端:
socket
connect
send
recv
close
TCP收端:
socket
bind
listen
accept
send
recv
close
1.connect
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:发送链接请求
参数:sockfd:套接字文件描述符
addr:目的地址存放空间首地址
addrlen:IP地址的大小
返回值:成功返回0;失败返回-1;
2.send
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送数据
参数:sockfd:文件描述符
buf:发送数据空间首地址
len:发送数据的长度
flags:属性默认为0
返回值:成功返回实际发送的字节数;失败返回-1;
3.recv
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:接受数据
参数:sockfd:套接字文件描述符
buf:存放数据空间首地址
len:最大接收数据的长度
flags:属性默认为0
返回值:成功返回实际字节数;失败返回-1;如果对面退出,返回0;
4.listen
int listen(int sockfd, int backlog);
功能:监听客户端发送的链接请求(该函数不会被阻塞)
参数:sockfd:套接字文件描述符
backlog:允许等待的尚未被处理的三次握手请求的最大个数
返回值:成功返回0 ;失败返回-1
5.accpet
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:处理等待链接队列中的第一个链接请求,该函数具有阻塞功能(如果没有人发送链接请求,回阻塞等待)
参数:socket:套接字文件描述符
address:存放IP地址的空间首地址
addrlen:存放IP地址大小空间首地址
返回值:成功返回一个新的文件描述符,失败返回-1;
#include "head.h"int main(void)
{int sockfd = 0;struct sockaddr_in sendaddr;ssize_t nsize = 0;int ret = 0;char tmpbuff[1024] = {0};sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1){perror("fail to socket");return -1;}sendaddr.sin_family = AF_INET;sendaddr.sin_port = htons(50000);sendaddr.sin_addr.s_addr = inet_addr("192.168.1.110");ret = connect(sockfd, (struct sockaddr *)&sendaddr, sizeof(sendaddr));if (ret == -1){perror("fail to connect");return -1;}gets(tmpbuff);nsize = send(sockfd, tmpbuff, strlen(tmpbuff), 0);if (nsize == -1){perror("fail to send");return -1;}memset(tmpbuff, 0, sizeof(tmpbuff));nsize = recv(sockfd, tmpbuff, sizeof(tmpbuff), 0);if (nsize == -1){perror("fail to recv");return -1;}printf("RECV:%s\n",tmpbuff);close(sockfd);return 0;}